特定の文字列を含むディレクトリで最新のファイルを見つける方法は?

特定の文字列を含むディレクトリで最新のファイルを見つける方法は?

特定のフォルダから最近作成されたファイルを検索し、コンテンツのパターンを特定する必要があります。これまで、私は次のコマンドを使用してかなりの成功を収めました。

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ソートされます。mls -t.定期的な文書。最後の日や最後の週など、最後に変更されたファイルm-1に制限を追加できます。mh-1h

ディレクトリが別の場所へのシンボリックリンクであり、/var/logそれを後にしたい場合(たとえば、find find -L/)にfind -follow置き換えることができます。**/***/

一致する最初のファイルを見つけて停止するには、次のものを使用できますgawk

gawk '/string/ {print FILENAME": "$0; found++}
      ENDFILE  {if (found) exit}' /var/log/**/*(.om)

関連情報