「/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"

終わり!

すでに変数があるのでyearmonth次のように書くのは簡単です。

find "$logfolder" \( -name '*.log' -o -name '*.lst' \) -newermt "$year-$month-01" \! -newermt "$year-$month-01 +1 month"

コマンドはたった1つ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- 

説明

2 つの呼び出しを括弧でグループ化すると、 (or) フラグ-nameで組み合わせることができます。これにより、 はファイルまたはファイルのいずれかを検索します。 (GNU 拡張機能) は、ファイルの変更月 ( )、変更年 ( )、パス ( ) の順に出力し、各フィールドの間にはタブ ( ) が挿入されます。-ofind.log.lst-printf%TB%TY%p\t

awk、1 番目のフィールド (月) が と同じであり$month、2 番目のフィールドが と同じであるかどうかを単純にチェックします$year

cut最初の 2 つのフィールド (月と年) を削除し、3 番目のフィールド以降のすべてを出力します。

$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

関連情報