2012-09-16 47 views
-5

我必須在Perl中編寫一個腳本來輸出特定目錄中的最後一個備份。使用Perl在目錄中查找最後一個備份文件

對於離

父目錄是/home/Backup/

/home/Backup/windows我有如

Windows_Server_A_20120901 
Windows_Server_A_20120902 
Windows_Server_A_20120903 
Windows_Server_B_20120901 
Windows_Server_B_20120902 
Windows_Server_B_20120903 
Windows_Server_XZ_20120903 
Windows_Server_XZ_20120901 
Windows_Server_XZ_20120902 
Windows_Server_XZ_20120903 

以下文件的輸出應該

Windows_Server_A_20120903 
Windows_Server_B_20120903 
Windows_Server_XZ_20120903 

/home/Backup/Unix爲如我有下面這些翼文件

Unix_Server_A_20120901.gz 
Unix_Server_A_20120902.gz 
Unix_Server_A_20120903.gz 
Unix_Server_B_20120901.gz 
Unix_Server_B_20120902.gz 
Unix_Server_B_20120903.gz 
Unix_Server_XY_20120901.gz 
Unix_Server_XY_20120902.gz 
Unix_Server_XY_20120903.gz 

此輸出應該是

Unix_Server_A_20120903.gz 
Unix_Server_B_20120903.gz 
Unix_Server_XY_20120903.gz 

我剛纔坐2例在這裏。在/home/Backup/我有其他的目錄,其他備份完成。

當然每個子目錄都會有一個子程序,因爲命名是不同的。

我是perl腳本的初學者。您的幫助將受到高度讚賞。

從我的角度來看,我想做Windows備份。

  1. 條(_20120901)的最後9個字符從文件名
  2. 然後搜索lastbackup即。

有人能指導我如何使用Perl來實現這一點。

謝謝大家。

我儘量在我想拿拿出上次備份

  1. 然後使用名稱調理服務器的唯一名稱的陣列中的步驟更加清晰一點( LS | grep的Windows_A |頭-1),以獲得thelast備份
  2. 我會改變directories.i不會讀/家裏所有的文件夾/備份
  3. 我也沒有噸的文件

Windows_Server_A(3次) Windows_Server_B(3次) Windows_Server_XY(3次)

還當我指定我得到的全路徑名的路徑,我怎麼能刪除它

!/usr/bin/perl 

use strict; 
use warnings; 

my @files = glob("Win*"); 
##my @files = glob("/home/backup/windows/Win*"); 

foreach my $file (@files) { 

$file = substr($file,0,-9); 

print "$file\n"; 

} 
exit 0; 

你能請指導並告知我所採取的步驟是否不合適。

謝謝

+0

閱讀有關如何'讀取文件contents'在Perl,也看看所有文件'perl正則表達式'。 – RanRag

回答

1

這不是一個真正的「如何解決我的問題」的問題。如果你能證明你已經努力實際解決這個問題,並且你不僅僅使用stackoverflow作爲一種免費的方式來完成你的工作,那將是非常好的。

我建議你開始閱讀這本書Learning Perl和/或看:

好運

*編輯編輯這裏的評論都有點有限代碼:

我不知道你重複的意思。 glob ("path/to/files*")將爲每個匹配文件返回一個條目。建立你的數據的適當結構的一種方式可以是:

use strict; 
use warnings; 
use Data::Dumper; 

my ($win, $unix); 
foreach my $dir (qw#/first/path/files /second/path/to/files /and/more/paths#) { 
    foreach my $file (glob ("$dir/*")) { 
    $file =~ s/$dir\///; # the file will contain the dir here, remove that +/
    $file =~ /^([A-Za-z_]*?)_([A-Z]+)_(\d+)(\.gz)?$/; # match the file 
    my ($type, $weird_letter, $date, $is_unix); 
    if ($1) { 
     ($type, $weird_letter, $date, $is_unix) = ($1, $2, $3, $4); 
    } else { 
     print STDERR "$file doesn't match, skipping!\n"; 
     next; 
    } 
    if ($is_unix) { # if it's a .gz file is it "unix", otherwise windows. 
     $unix->{$dir}{$weird_letter}{$date} = $file; 
    } else { 
     $win->{$dir}{$weird_letter}{$date} = $file; 
    } 
    } 
} 
print Dumper ($win, $unix); 

該解決方案是一個有點天真,例如,如果你有一大堆的文件是它更好地在你的* 要麼使用READDIR或匹配AZ *類型,並在一次採取其中之一。這裏留下的是使用排序功能,並打印相關文件。

如果你更多地展示自己嘗試過的東西,那麼你就更有可能獲得幫助,因爲許多人來到像工作/學校問題一樣的堆棧溢出之處,並希望在不做任何工作的情況下提供解決方案。

+0

你好 我想我需要首先要調理服務器所有的名字,後來我將用它來獲得最後的備份 這是我迄今所做的,但我得到的重複姓名 #!/ usr/bin/perl 使用strict; 使用警告; my @files = glob(「Windows_Server *」); foreach my $ file(@files){ $ file = substr($ file,0,-9); print「$ file \ n」; } exit 0; 我如何刪除重複的名稱,以及如何指定目錄即/ home/Backup/windows。我將在劇本中定期更換。一旦我刪除了重複的名字,我將着手如何獲得最後備份 – user1675315

+0

我編輯了我的回覆,而不是將它放在評論中。 – Jon

0

你可能想嘗試這樣的事情,只是填充@files與使用readdirglob迪爾的releavant文件:

#!/usr/bin/env perl 
use strict; 
use warnings; 
use Data::Dumper; 

my @files = qw(Windows_Server_A_20120901 
     Windows_Server_A_20120902 
     Windows_Server_A_20120903 
     Windows_Server_B_20120901 
     Windows_Server_B_20120902 
     Windows_Server_B_20120903 
     Windows_Server_XZ_20120903 
     Windows_Server_XZ_20120901 
     Windows_Server_XZ_20120902 
     Windows_Server_XZ_20120903); 
my %seen; 

my %latest = map { $_->[0] => $_->[1] } 
       grep { not $seen{$_->[0]}++ } 
       sort { $b->[1] <=> $a->[1] } 
        map { my ($server,$time) = $_ =~ m/^(.+?)_(\d+)$/; 
         [$server, $time] } @files; 

print Dumper(\%latest); 
0

這應該做你所需要的。它看起來所有目錄中/home/Backup/,發現在他們每個人的最新過時的文件,並顯示與貴婦人日期

use strict; 
use warnings; 

use File::Spec; 

my $root = '/home/Backup/'; 

opendir my $dh, $root or die $!; 
my @dirs; 
while (readdir $dh) { 
    next if /^\.\.?$/; 
    my $dir = File::Spec->catdir($root, $_); 
    next unless -d $dir; 
    push @dirs, $dir; 
} 

for my $dir (@dirs) { 

    print "\nProcessing directory $dir\n"; 
    opendir my $dh, $dir or die $!; 
    my @files; 
    my $lastdate = 0; 
    while (readdir $dh) { 
    my $file = File::Spec->catfile($root, $_); 
    next unless -f $file; 
    next unless /\D(\d{8})(\.|$)/; 
    $lastdate = $1 if $1 > $lastdate; 
    push @files, $file; 
    } 
    print "$_\n" for grep /\D$lastdate(?:\.|$)/, @files; 
} 
相關問題