2013-10-12 38 views
0

這一個正在困擾着我,所以我正在接觸到我知道的最好的編碼社區,在這麼多長時間的咖啡之後尋求幫助。等待文件不再是不存在的perl

基本上我需要一個perl腳本來等待文件不再出現在服務器上,然後再繼續。真的在等待所有屏幕會話被終止(/ var/run/screen成爲一個空目錄)。

#!/usr/bin/perl 
my $directory="/root/screens"; 

opendir(DIR, $directory) or die "couldn't open $directory: $!\n"; 
my @files = readdir DIR; 
closedir DIR; 

foreach (@files){ 

     while (-e $_) { 
     print "$directory has $_ existing\n"; 
     sleep 1; 
     } 
} 

Ex Dir。

total 8 
    drwxr-xr-x. 2 root root 4096 Oct 11 22:58 ./ 
    drwxr-x---. 17 root root 4096 Oct 11 05:33 ../ 
    -rw-r--r--. 1 root root 0 Oct 11 22:58 S-root 
    -rw-r--r--. 1 root root 0 Oct 11 22:58 S-root1 

上面沒有明顯的工作,但我只是沒有看到一個很好的辦法做到這一點在谷歌和它一直是漫長的一天。

+0

您需要DIR中的美元符號($ DIR) – amrfaissal

+2

不,您不需要DIR中的美元符號。 – mob

回答

2
#!/usr/bin/perl 
my $directory="./test"; 

my $no_empty = 1; 
my @files =(); 
while($no_empty) { 
    opendir(DIR, $directory) or die "couldn't open $directory: $!\n"; 
    @files = readdir DIR; 
    #print @files; 
    if(scalar @files == 2) { 
     $no_empty = 0; 
     last; ##directory is empty 
    } else { 
     print "Below files present--"; 
     @files = grep {$_ !~ /\.{1,2}$/} @files; ## skip . (current dir) and parent dir (..) 
     print join (', ',@files); ##comma seperated file list 
     print "\n"; ##mendetory to flash the output buffer 
     sleep 1; 
    } 
} 

print "Start with processing cz dir is empty" 

樣品運行 -

> Below files present--def, abc 
> Below files present--def, abc 
> Below files present--def, abc 
> Below files present--def, abc 
> Start with processing cz dir is empty 
+0

完美地工作,非常感謝你病毒 – MattSizzle

0

我想你需要一個while循環執行,只要該目錄不是空的。一旦你的目標目錄爲空,程序將返回。

讓我們創建一個子例行檢查,如果目標目錄爲空:

sub isDirEmpty { 
     my ($dir) = @_; 
     my $file; 
     if (opendir my $DFH, $dir) { 
       while (defined ($file = readdir $DFH)) { 
         next if $file eq '.' or $file eq '..'; 
         closedir $DFH; 
         return 0; #Not Empty 
       } 
       closedir $DFH; 
       return 1; #Empty 
     } else { 
       return -1; #Doesn't exist 
     } 
} 

一個小的測試與無限循環:

my $targetDir = "/path/to/target/dir"; 
while (1) { 
     my $result = isDirEmpty($targetDir); 
     if ($result eq 1) { 
       print "Your directory is empty\n"; 
       last; 
     } elsif ($result eq -1) { 
       print "There has been an error! please check your lousy code!\n"; 
     } 
} 

瞧!

+0

有效,但我正在尋找可能的最少線條的解決方案,因爲它已經是一個相當大的腳本的一部分。我選擇了由病毒發佈的答案。 – MattSizzle

0

如何:

my $directory="/root/screens"; 
while(<$directory/*>) { 
    say "not empty"; 
    sleep 1; 
} 
+0

以上只會對目錄中的每個文件迭代一次。我最初希望自己使用glob(ed)通配符,但沒有太多運氣。 – MattSizzle

0
#!/usr/bin/perl 
my $directory = "/root/screens"; 

while(1) { 
    my @files = <$directory/*>; 
    if($#files == -1) { 
     last; 
    } else { 
     sleep 1; 
    } 
} 

# do some stuff when the directory is empty 
0
#!/usr/bin/perl 

my $directory="/root/screens"; 

opendir(DIR, $directory) or die "couldn't open $directory: $!\n"; 
@files = readdir DIR; 
closedir DIR; 

while (@files > 2) ### If @files have more than 2 items. 
{ 
opendir(DIR, $directory) or die "couldn't open $directory: $!\n"; 
@files = readdir DIR; 
closedir DIR; 
sleep (1); 
} 

print "Directory is now empty and loop has ended"; 

注意@files總會有2項,因爲總是會有。 /和../