
指定されたファイルのデータを印刷できるように、コマンドの出力をコマンドfind
にリダイレクトしたいと思います。cat
たとえば、 find の出力が の場合/aFile/readme
、 cat は と解釈される必要がありますcat ./aFile/readme
。 どうすればこれを即座に実行できるでしょうか?
パイプを使用する必要がありますか?
私はこれのバージョンを試しました:
cat | find ./inhere -size 1033c 2> /dev/null
しかし、これは完全に間違っていると思いますか? もちろん、出力は 1 つのファイルのみであり、複数のファイルではないことは確かです。
それで、どうすればいいのでしょうか?Googleで検索しましたが、解決策が見つかりませんでした。おそらく、検索方法が悪かったからでしょう。:P
答え1
find
次のアクションを使用して、これを単独で実行できます-exec
。
find /location -size 1033c -exec cat {} +
{}
は、によって見つかったファイルによって置き換えられfind
、 は複数の引数を取ることができるため、+
の呼び出しごとに可能な限り多くの引数を読み取ることができます。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
ここでは行番号を取得するオプションを使用しています。
答え2
コマンド置換
もう一つの選択肢はコマンド置換コマンドを で囲むと、$()
コマンドが実行され、その出力でコマンドが置き換えられます。
cat $(find ./inhere -size 1033c 2> /dev/null)
となります
cat ./inhere/file1 ./inhere/file2 ./inhere/file3
これは、バックティックを使用してコマンドをラップする古いスタイルを使用することとほぼ同等です。
cat `find ./inhere -size 1033c 2> /dev/null`
詳細は上記のリンク先のドキュメントをご覧ください
bash は、サブシェル環境でコマンドを実行し、コマンド置換をコマンドの標準出力に置き換えて、末尾の改行を削除することで展開を実行します。埋め込まれた改行は削除されませんが、単語分割中に削除される可能性があります。コマンド置換は、$(cat file)
同等ですがより高速な に置き換えることができます$(< file)
。
旧式のバッククォート形式の置換が使用される場合、バックスラッシュは$
、、、`
または が続く場合を除き、その文字通りの意味を保持します\
。バックスラッシュが先行しない最初のバッククォートは、コマンド置換を終了します。この$(command)
形式を使用する場合、括弧内のすべての文字がコマンドを構成し、特別に扱われる文字はありません。
コマンド置換はネストできます。バッククォート形式を使用するときにネストするには、内側のバッククォートをバックスラッシュでエスケープします。
置換が二重引用符で囲まれている場合、結果に対して単語の分割とファイル名の拡張は実行されません。
見るこの他の答え使用例をいくつか紹介します。
答え3
これにより、テキスト (ASCII) ファイルの名前と内容のみが再帰的に印刷されます。
find . -type f -exec grep -Iq . {} \; -print | xargs awk 'FNR==1{print FILENAME ":" $0; }'
もう一度挑戦
find . -type f -exec grep -Iq . {} \; -printf "\n%p:" -exec cat {} \;
答え4
パイプとxargsを使用する
find /* -name pg_hba.conf | xargs cat
権限不足のために失敗した場合は、sudo を使用して、検索するディレクトリで find コマンドを実行する権限があることを確認できます。
sudo find /* -name pg_hba.conf | xargs sudo cat