“/usr/bin/stat:參數列表太長”錯誤

“/usr/bin/stat:參數列表太長”錯誤

我需要獲取目錄(.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 月」和$year2012 年)來測試上述內容:

$ 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

相關內容