与えられたファイルのデータを印刷できるように、コマンドの出力をコマンドにリダイレクトしたいと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
これにより、テキストファイルの名前と内容のみが再帰的に印刷されます。
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