[英]Perl one-liner to empty directory explanation
本文指出了一種使用perl
清空包含大量文件的目錄的方法:
perl -e 'for(<*>){((stat)[9]<(unlink))}'
自從它調用stat
並與每個文件的unlink
返回值進行比較時,這使我感到困惑。
我沒有調用stat
進行了測試, stat
更快。 在這里調用stat
的目的是什么?
該統計數據是無用的,可能是出於對性能優化的狂熱嘗試。
您可以通過B :: Deparse運行它,以查看它沒有做任何有趣的事情。
$ perl -MO=Deparse -e 'for(<*>){((stat)[9]<(unlink))}'
use File::Glob ();
foreach $_ (<*>) {
(stat $_)[9] < unlink($_);
}
-e syntax OK
(stat)[9]
是自1970年以來以秒為單位的文件修改時間,通常是一個很大的數字。 unlink
返回刪除的文件數,在這種情況下,它總是為0或1。無論如何,什么也沒有檢查比較(添加-w和Perl會警告您)。
這將做同樣的事情並且更快。
perl -e 'unlink for <*>'
我有兩個猜測。 首先是作者打算編寫(stat)[9] && unlink
,它將在取消(stat)[9] && unlink
之前檢查文件是否存在。 顯然有些巫毒教有時會更快 。 這將是不正確的,因為即使文件存在, (stat)[9]
也可以返回0。 相反,您需要-e && unlink
。 這很愚蠢,因為您剛剛閱讀了目錄中的文件列表。 它也是非原子的。 無論內核或文件系統如何運行,它都可能會變慢,因為-e代表了數十行C代碼。
我的另一個猜測也是優化伏都教。 我發現有關在子進程中進行統計的評論 ,因此inode已在文件系統緩存中。 這不是Perl代碼所要做的,但可能是一些貨物培養。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.