
.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"
コマンドはたった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 拡張機能) は、ファイルの変更月 ( )、変更年 ( )、パス ( ) の順に出力し、各フィールドの間にはタブ ( ) が挿入されます。-o
find
.log
.lst
-printf
%TB
%TY
%p
\t
はawk
、1 番目のフィールド (月) が と同じであり$month
、2 番目のフィールドが と同じであるかどうかを単純にチェックします$year
。
cut
最初の 2 つのフィールド (月と年) を削除し、3 番目のフィールド以降のすべてを出力します。
$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