特定のフォルダから最近作成されたファイルを検索し、コンテンツのパターンを特定する必要があります。これまで、私は次のコマンドを使用してかなりの成功を収めました。
find /var/log/folder -type f -printf '%T+ %p\n' | sort | tail -n1 | xargs grep 'string to find'
一致する最新のファイルが見つかりましたが、標準出力に予期しない行が表示されます。
$ find /var/log/folder -type f -printf '%T+ %p\n' | sort | tail -n1 | xargs grep 'string to find'
grep: 2016-05-12+20:01:59.0570667340: No such file or directory
/var/log/folder/file:string to find
「該当するファイルまたはディレクトリなし」行がないようにコマンドを変更するにはどうすればよいですか?
答え1
ls -1rt /path/to/files/ | tail -n1
最新のファイル(修正時間ベース)はディレクトリにあります。これを引数として渡しますgrep
。
grep 'string to find' "$(ls -1rt /path/to/files/ | tail -n1)"
答え2
スペースを含む名前の安全なバージョンは次のとおりです。
find /var/log/folder -type f -printf '%T@ %p\0' | sort -rz | sed -Ezn '1s/[^ ]* //p' | xargs --null grep string
仕組み:
find /var/log/folder -type f -printf '%T@ %p\0'
その後、ファイルを見つけて修正時間を秒単位で印刷し、その後にスペースと名前、ヌル文字が続きます。
sort -rz
null で区切られたデータをソートします。
sed -Ezn '1s/[^ ]* //p'
sed -z
ヌル文字で区切られた行を処理します。これは最新のファイルの名前だけを印刷します。xargs --null grep string
その後、nullで区切られたファイル名を読み取り、文字列のgrepを読み取ります。
答え3
そしてzsh
:
grep string /var/log/**/*(.om)
修飾子を使用すると、om
ファイルは、一致を次に制限するように、最新の項目から最も古い項目までの変更時間に基づいてo
ソートされます。m
ls -t
.
定期的な文書。最後の日や最後の週など、最後に変更されたファイルm-1
に制限を追加できます。mh-1
h
ディレクトリが別の場所へのシンボリックリンクであり、/var/log
それを後にしたい場合(たとえば、find find -L
/)にfind -follow
置き換えることができます。**/
***/
一致する最初のファイルを見つけて停止するには、次のものを使用できますgawk
。
gawk '/string/ {print FILENAME": "$0; found++}
ENDFILE {if (found) exit}' /var/log/**/*(.om)