特定の名前で始まるすべてのファイルを検索し、各ファイルを調べて文字列を含む行を見つけ、文字列を含む各ファイルの最後の行のみを出力します。ステップバイステップで、私は最初に「A123」で始まる自分のディレクトリ内のすべてのファイルを見つけます
find . -name 'A123*'
次に、「トライアル」を含むファイルの各行を取得します
find . -name 'A123*' -exec grep 'Trial' {} \;
そして、ここから最後の行だけを印刷したいのですが、
find . -name 'A123*' -exec grep 'Trial' {} | tail -1 \;
ただし、この最後のコマンドは機能しません。これを修正して、取得しようとしているものを取得するにはどうすればよいですか?
|
はシェル演算子であるため、find
の出力全体がtail
に渡されます。実行するすべてのコマンドをグループ化してsh
またはbash
(または任意のシェル)に渡すことにより、execで単一のコマンドのみを実行する必要があります
find . -name 'A123*' -exec bash -c 'grep Trial "$1" | tail -1' grep {} \;
または、他のいくつかの単一のコマンドを使用して、最後の一致を 行パターンの最後の出現をgrepする方法 から取得できます。
ファイルの名前に特殊文字#$/\`&*~-...
などの特殊文字が含まれていないことを確認できる場合は、これを使用できます
find . -name 'A123*' -exec bash -c "grep 'Trial' {} | tail -1" \;
ただし、知らない思いがけない名前があった場合、おかしなことが発生することがありますのでご注意ください。詳細については find -exec sh -c
を安全に使用できますか? をお読みください