find
コマンドの出力をcat
コマンドにリダイレクトして、指定したファイルのデータを出力できるようにしたいと思います。
たとえば、findの出力が/aFile/readme
の場合、猫はcat ./aFile/readme
として解釈されます。どうすればすぐにそれを実行できますか?
パイプを使用する必要がありますか?
私はこれのバージョンを試しました:
cat | find ./inhere -size 1033c 2> /dev/null
しかし、これは完全に間違っていると思いますか?もちろん、出力は1つのファイルだけで、複数のファイルではないと確信しています。
それで、どうすればそれができますか?私はGoogleで検索しましたが、適切に検索しなかったためか、解決策が見つかりませんでした:P
-exec
アクションを使用してfind
だけでこれを行うことができます:
find /location -size 1033c -exec cat {} +
{}
は、見つかったファイルに展開され、+
を使用すると、cat
の呼び出しごとに可能な限り多くの引数を読み取ることができます。猫は複数の引数を取ることができるためです。
find
に+
拡張子がない場合、またはファイルを1つずつ読み取りたい場合:
find /location -size 1033c -exec cat {} \;
cat
のオプションを使用する場合は、次のようにします。
find /location -size 1033c -exec cat -n {} +
find /location -size 1033c -exec cat -n {} \;
ここでは、-n
オプションを使用して行番号を取得しています。
コマンド置換
別のオプションは Command Substitution を使用することです。コマンドを$()
でラップすると、コマンドが実行され、コマンドがその出力に置き換えられます。
_cat $(find ./inhere -size 1033c 2> /dev/null)
_
となります
_cat ./inhere/file1 .inhere/file3
_
これは、バックティックを使用して古いスタイルのラッピングコマンドを使用することとほぼ同じです。
_cat `find ./inhere -size 1033c 2> /dev/null`
_
上記のリンクからのドキュメントの詳細
Bashは、サブシェル環境でコマンドを実行し、コマンド置換をコマンドの標準出力に置き換えて、末尾の改行を削除することにより、拡張を実行します。埋め込まれた改行は削除されませんが、Wordの分割中に削除される場合があります。コマンド置換$(cat file)
は、同等の高速な$(< file)
で置き換えることができます。
置換の古いスタイルのバッククォート形式が使用されている場合、_$
_、_`
_、または_\
_が後に続く場合を除いて、バックスラッシュは文字どおりの意味を保持します。バックスラッシュが前に付いていない最初のバッククォートは、コマンド置換を終了します。 $(command)
形式を使用する場合、括弧内のすべての文字がコマンドを構成します。特別に扱われるものはありません。
コマンド置換はネストできます。バッククォートされたフォームを使用するときにネストするには、内側のバッククォートをバックスラッシュでエスケープします。
置換が二重引用符で囲まれている場合、結果に対してWordの分割とファイル名の展開は行われません。
使用例については この他の回答 を参照してください。
これは、テキスト(ASCII)ファイルの名前と内容を再帰的にのみ出力します。
find . -type f -exec grep -Iq . {} \; -print | xargs awk 'FNR==1{print FILENAME ":" $0; }'
もう1つの試み
find . -type f -exec grep -Iq . {} \; -printf "\n%p:" -exec cat {} \;