
我需要獲取目錄(.log/.lst
)中存在的文件()列表$logfolder
,其創建日期是特定的$year
並且$month
stat --format='%y %n' $logfolder/* |
grep "$year-$month-"|
awk -F' ' '{print $4}'|
grep 'log$\|lst$' > $archivepath/filesToArchive
當我向文件過多的資料夾查詢命令時,這不起作用。我收到以下錯誤:
-bash: /usr/bin/stat: Argument list too long
答案1
對於一個有趣的可能性,如果您find
有手柄-newerXY
,請使用它!例如,要取得 1977 年 10 月的文件:
find "$logfolder" \( -name '*.log' -o -name '*.lst' \) -newermt "1977-10-01" \! -newermt "1977-10-01 +1 month"
完畢!
由於您已經有了變數year
並且month
可以直接寫為:
find "$logfolder" \( -name '*.log' -o -name '*.lst' \) -newermt "$year-$month-01" \! -newermt "$year-$month-01 +1 month"
只有一個find
指令!驚人的!
答案2
我會這樣做:
find "$logfolder" \( -name '*.log' -o -name '*lst' \) -printf "%TB\t%TY\t%p\n" |
awk '$1==m && $2==y' m="$month" y="$year" | cut -f 3-
解釋
透過將兩個-name
呼叫分組在括號中,您可以將它們與-o
(or) 標誌組合起來。這將find
查找.log
或.lst
文件。 (GNU擴充-printf
)列印檔案的修改月份 ( %TB
),然後列印其修改年份 ( %TY
),然後列印其路徑 ( %p
),每個欄位之間有一個製表符 ( \t
)。
只是awk
檢查第一個欄位(月份)是否與 相同$month
,第二個欄位是否與 相同$year
。
刪除cut
前兩個欄位(月份和年份)並列印第三個欄位之後的所有內容。
$month
我透過建立 2012 年 12 月修改的檔案(並設定為「12 月」和$year
2012 年)來測試上述內容:
$ touch -d "December 13 2012" {a,b,c}{.lst,.log}
$ touch c.lst a.log ## c.lst and a.log now have today's modification date.
$ find $logfolder \( -name '*.log' -o -name '*lst' \) -printf "%TB\t%TY\t%p\n" |
awk '$1==m && $2==y' m="$month" y="$year" | cut -f 3-
./b.log
./c.log
./b.lst
./a.lst
(請注意,它假設檔案和目錄名稱不包含換行符)。
答案3
嘗試這個:
find $logfolder -type f -exec stat --format='%y %n' "{}" + |
grep "$year-$month-"|
awk -F' ' '{print $4}'|
grep 'log$\|lst$' > $archivepath/filesToArchive
答案4
ls -lh *.log *.lst logfolder | grep year | grep month