如何洗掉沒有檔案擴展名的檔案?
我正在使用 Strawberry Perl 5.32.1.1 64 位版本。這是我所擁有的:
unlink glob "$dir/*.*";
我還嘗試了以下方法:
my @file_list;
opendir(my $dh, $dir) || die "can't opendir $dir: $!";
while (readdir $dh){
next unless -f;
push @file_list, $_;
}
closedir $dh;
unlink @file_list;
這樣做的結果是所有帶有擴展名的檔案都被洗掉,
但那些沒有擴展名的檔案仍然未被洗掉。
uj5u.com熱心網友回復:
你并沒有真正解釋問題是什么,所以這只是一個猜測。
您正在使用readdir()獲取要洗掉的檔案串列,然后將該串列傳遞給unlink(). 這里的問題是您回傳的檔案名readdir()不包括您最初傳遞給的目錄名readdir()。所以你需要像這樣填充你的陣列:
push @file_list, "$dir/$_";
在評論中你說:
我正在測驗 unlink glob "$dir/ . "; 但沒有檔案擴展名的檔案不會被洗掉。
好吧,如果您考慮一下,您只是要求帶有擴展名的檔案。如果您傳遞給的模式glob()包含*.*,那么它只會回傳與該模式匹配的檔案(即帶有點和點后更多文本的檔案)。
解決方案似乎是簡化您傳遞給的模式,glob()因此它只是*.
unlink glob "$dir/*";
當然,這也會嘗試洗掉目錄,因此您可能想要這樣:
unlink grep { -f } glob "$dir/*";
uj5u.com熱心網友回復:
您希望glob執行類似 DOS 的 globbing,但該glob函式提供了類似 globbing 的功能csh。
glob("*.*")匹配所有包含 a 的.檔案,忽略帶有前導點的檔案。glob("*")匹配所有檔案,忽略帶前導點的檔案。glob("* .*")匹配所有檔案。
請注意,每種檔案都是匹配的。這包括目錄。特別要注意的是.和..由 匹配.*。
如果你想要 DOS 風格的 glob,你可以使用File::DosGlob。
uj5u.com熱心網友回復:
是的,您可以使用glob,但您需要做更多的作業。 grep可以幫助選擇您要查找的檔案。
*抓取所有條目(不以點開頭),-f僅選擇檔案,!/\./洗掉名稱中帶有點的檔案:
unlink grep {!/\./} grep {-f} glob "$dir/*";
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/340958.html
標籤:perl
上一篇:CUDA內核的奇怪行為
