2014-01-18 20 views
2

跟着從這裏開始:Perl Imgsize not working in loop? 我還有一個問題 - 當我讀取目錄中的文件時,如何不讓perl列出單點和雙點條目?如何忽略Perl的readdir中的單點和雙點條目?

如上鍊接的問題,我輸出到while循環(while ($file = readdir($dh)))是這樣的:

. 
.. 
file1.jpg 
file2.jpg 
file3.jpg 
file4.jpg 
file5.jpg 

而這造成的問題,因爲我也得到了一個櫃檯的地方,這是我的計數文件。並且...不計爲文件,所以我的計數器在我的目錄中提供的文件數量比實際數量多。

我加了if($file == "." || $file == ".."){ continue;}if ($file ~ /^\./ or $file ~ /^\.\./) {continue;}以及對while循環開始的不同變化......但由於編譯錯誤,我一直得到中止。

我們如何獲得單點和雙點條目?

回答

6

要測試你必須使用eq字符串:

if($file eq "." || $file eq ".."){ next;} 

或:

next if $file =~ /^\.\.?$/; 
+3

正則表達式'/\ A \。\。?\ z /'會更好,因爲它與某些文件系統中有效的文件'「\ n」'不匹配。 – amon

+0

@amon:謝謝,我沒有意識到這一點。你能說什麼文件系統處理? – Toto

+1

在文件系統的Ext系列(主要用於Linux)中,文件名可能包含除'\ 0'和'/'之外的任何*字節。對於NTFS也是如此,儘管Windows會施加進一步的限制。另請參閱[文件系統的比較](https://en.wikipedia.org/wiki/Comparison_of_file_systems#Limits) – amon

0

這部作品,並跳過第2。和..

if($fil !~ m/^\.+/i) 
    { 
     your stuff here 
    } 
+0

歡迎來到堆棧溢出!雖然這段代碼片段可能解決這個問題,但[包括解釋](http://meta.stackexchange.com/questions/114762/explaining-entirely- code-based-answers)確實有助於提高您的帖子的質量。請記住,您將來會爲讀者回答問題,而這些人可能不知道您的代碼建議的原因。 – NathanOliver

2

我會建議別的東西 - 不使用readdir,而使用glob

my @dirlist = glob ("$dir/*.jpg"); 

然後你會得到路徑以匹配規範文件的列表。如果你正在做這是特別有用:

foreach my $file (glob ("/path/to/file/*.jpg")) { 
    open (my $input, '<', $file) or die $!; 
} 

在以利用readdir你只能得到一個文件名,並有自己的重建路徑。

0

我已經來到另一個解決方案,這對我的作品,刪除子文件夾臨時的所有文件 - 不是第一個文件開始(0),但只與第三檔(2):

#!/bin/perl 
@AllFiles =(); 
opendir(DIRECTORY, "temp"); 
@AllFiles = readdir(DIRECTORY); 
closedir DIRECTORY; 
print $#AllFiles-1 ."\n";     #Show 3 for three files, as it shows number of last file: 0=. 1=.. 2=aaa.txt 3=bbb.xml 4=ccc.pdf 
$FileNumber = 2;        #Starting with file 2, don't need to try deleting current and parent folders 
until($FileNumber > $#AllFiles) { 
    unlink ("temp/" . $AllFiles[$FileNumber]); 
    print $FileNumber-1 . ": temp/" . $AllFiles[$FileNumber] . "\n";  #show file numbers as 1=aaa.txt 2=bbb.xml 3=ccc.pdf 
    $FileNumber += 1; 
}