[英]How can I take a list of strings and find files who name matches a string in the list?
[英]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.