簡體   English   中英

如何使用find和Perl列出文件?

[英]How can I list files with find and Perl?

我在基於HP-UX的計算機上工作,我需要按日期列出文件夾中包含的日志名稱,並將名稱分隔為“;” 和結果,按日期降序排序,存儲在txt中,因此txt的內容如下:

2019-02-02;/home/user/Documents/imthelog03.log
2019-02-01;/home/user/Documents/imthelog02.log
2019-01-29;/home/user/Documents/imthelog01.log

我試過這個:

find /home/user/Documents/*.log* exec perl -MPOSIX -e 'print POSIX::strftime "%Y%m%d\n", localtime((stat $ARGV[0])[9])'

但我不能讓我需要什么,我無法用stats我使用for按行讀入行,所以我怎樣才能獲得日期和path/filename由分離; 在一個txt中,按日期降序排序使用bash並最終perl,謝謝!

可以在Perl中完成所有操作

perl -MPOSIX=strftime -wE'$d = shift || "."; 
    say strftime("%Y-%m-%d", localtime((stat $_)[9])), "; $_" 
        for sort { (stat $b)[9] <=> (stat $a)[9] } glob "$d/*log*"
' dir-name

你在哪里提交dir-name到一行(或者它與. ,當前目錄一起使用)。

注意,我沒有看到需要find因為您從目錄中獲取(日志)文件列表。

這可以優化,不重復運行stat ,但我懷疑它在預期使用中很重要。 我建議把它放在一個漂亮的小腳本中。


盡管如此, stat並不便宜,如果定期捕獲長文件列表,則使用

perl -MPOSIX=strftime -wE'$d = shift || "."; 
    say strftime("%Y-%m-%d", localtime($_->[1])), "; $_->[0]" 
        for 
            sort { $b->[1] <=> $a->[1] } 
                map { [$_, (stat $_)[9]] } glob "$d/*log*"
' dir-name

在那里我將聲明分成更多的行以強調變化。

glob的輸入文件列表用於首先使用map構建另一個列表,每個文件名都有一個arrayref:名稱本身該文件的時間戳。 然后, sort的成對比較不必每次都運行stat ; 他們使用預先計算過一次的時間戳。 這稱為Schwartzian變換 此外, sprintf也不需要再次運行stat

請注意,優化帶來了開銷,因此只有在確實需要時才使用它。 例如,參見本文 (上一節)的討論和鏈接。

find /home/user/Documents/*.log* -type f -exec perl -MPOSIX -le 'print strftime("%Y%m%d",localtime((stat $ARGV[0])[9])),";$ARGV[0]"' {} \; | sort -k1,1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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