簡體   English   中英

Perl一線到空目錄說明

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM