「検索」コマンドの出力で「猫」コマンドを使用する方法


13

findコマンドの出力をコマンドにリダイレクトしてcat、指定したファイルのデータを印刷できるようにします。

たとえば、findの出力がの/aFile/readme場合、猫はと解釈されcat ./aFile/readmeます。どうすればすぐにそれを実行できますか?

パイプを使用する必要がありますか?

私はこれのバージョンを試しました:

cat | find ./inhere -size 1033c 2> /dev/null

しかし、これは完全に間違っていると思いますか?もちろん、出力は複数のファイルではなく、1つのファイルだけであると確信しています。

では、どうすればよいですか?私はGoogleで検索しましたが、適切に検索しなかったためか、解決策が見つかりませんでした:P

回答:


21

アクションfindを使用してこれを単独で行うことができます-exec

find /location -size 1033c -exec cat {} +

{}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、行番号を取得するオプションを使用しています。


だから、もし私が正しい場合:{}は変数のようなもので、そこにfindコマンドの出力が格納され、 "+"記号の後にcatパラメータを書き込むことになっていますか?番号 ?編集:あなたはあなたの投稿を編集しました、そして今あなたは私の質問に答えました:P Thanx man!解決しました!
エクサプシー

@ general656 ..私の編集をチェック
heemayl

1
cat-nオプションを知らなかったという事実は私を驚かせます。ランダムな質問を読むのが大好きです。
mazunki

0

コマンド置換

別のオプションは、コマンド置換を使用することです。コマンドをラップすると、コマンド$()が実行され、コマンドがその出力に置き換えられます。

cat $(find ./inhere -size 1033c 2> /dev/null)

となります

cat ./inhere/file1 .inhere/file3

これは、バックティックで古いスタイルのラッピングコマンドを使用することとほぼ同じです。

cat `find ./inhere -size 1033c 2> /dev/null`

上にリンクされているドキュメントの詳細

Bashは、サブシェル環境でコマンドを実行し、コマンド置換をコマンドの標準出力に置き換えて、末尾の改行を削除することにより、拡張を実行します。埋め込まれた改行は削除されませんが、単語分割中に削除される場合があります。コマンドの置換$(cat file)は、同等の高速なコマンドで置き換えることができます$(< file)

置換の古いスタイルのバッククォートのフォームを使用する場合は、バックスラッシュが続いたときを除き、その文字通りの意味を保持し$`または\。バックスラッシュが前に付いていない最初のバッククォートは、コマンド置換を終了します。$(command)フォームを使用する場合、括弧内のすべての文字がコマンドを構成します。特別に扱われるものはありません。

コマンド置換はネストできます。バッククォートされたフォームを使用するときにネストするには、バックスラッシュで内側のバッククォートをエスケープします。

置換が二重引用符で囲まれている場合、結果に対して単語分割とファイル名拡張は実行されません。

良い使用例については、この別の回答を参照してください。


findあまりにも多くのファイルが見つかった場合、これはを呼び出そうとする「引数リストが長すぎます」というエラーを生成することに注意してくださいcat。また、空白文字を含むファイル名と、場合によってはファイル名グロビング文字を含むファイル名の処理にも問題があります。
クサラナナンダ

-1

これは、テキスト(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 {} \;

-2

pipeとxargsを使用する

find /* -name pg_hba.conf | xargs cat

権限がないために失敗した場合は、sudoを使用して、検索しているディレクトリでfindコマンドを実行する権限があることを確認できます。

 sudo find /* -name pg_hba.conf | xargs sudo cat

1
そして、誰かがと呼ばれるファイルを作成した場合/tmp/ /dev/urandom /pg_hba.conf、rootはの内容全体をダンプし/dev/urandomます。状況によっては、さらに悪いことになるでしょう。xargsまったく使用しない-0場合は、ほとんど使用しないでください。またsudo xargs、より良いでしょうxargs sudo。そして/*、より良いでしょう/
ステファンChazelas

1
OPはcatを使用して、ファイルの内容をstdoutに印刷したいと考えています。したがって、目的は猫によって提供されます。問題は、sudoやfindを使用する方法ではなく、findコマンドの出力からcatを使用してファイルの内容を出力する方法です。上記のコマンドは問題を解決します。はい、xargs -0はあなたが指摘した唯一の建設的なものでした。しかし、使用法を示していませんでした。無礼にならないようにしてください。
アプリワーク

それが失礼に見えた場合は申し訳ありません。それは意図ではありませんでした。限界を指摘したかった。あなたの答えショーの悪い習慣(find|xargsなし-0ので、実際に禁止されるべき)、ダウン票。findwithout の出力は-print0確実に後処理できません。-print0標準ではありません。とは言っても、標準でsudo find / -name pg_hba.conf -exec cat {} +はコンテンツのダンプを作成することもできます/dev/urandom(たとえば、誰か/tmp/pg_hba.confがそこからシンボリックリンクを作成し、少なくとも競合状態のない簡単なポータブルな方法がない場合)。
ステファンChazelas

1
sudo「万が一」を使わないようにしましょうか。
lindhe 2017

まあ、それは実行するよりも優れていますsudo rm -rf /
devinbost
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.