15

現在のディレクトリで、ファイル名とその内容を出力したいと思います。ファイル名またはコンテンツを個別に印刷できます

find . | grep "file_for_print" | xargs echo
find . | grep "file_for_print" | xargs cat

しかし、私が欲しいのは、次のように一緒に印刷することです:

file1
line1 inside file1
line2 inside file1
file2
line1 inside file2
line2 inside file2

複数のコマンドを引数として xargsを読み込ん でみました

find . | grep "file_for_print" | xargs -I % sh -c 'echo; cat;'

しかし、うまくいきません。私は xargs に詳しくないので、「-I % sh -c」が正確に何を意味するのかわかりません。誰でも私を助けることができますか?ありがとう!

4

5 に答える 5

30

find . | grep "file_for_print" | xargs -I % sh -c 'echo %; cat %;'(OPに%sがありませんでした)

于 2013-09-11T02:29:28.023 に答える
14

まず、次のような違いはほとんどありません。

find . | grep "file_for_print" | xargs echo

find . -name "file_for_print*"

ただし、2 番目のものは のようなファイル名と一致せずthis_is_not_the_file_for_print、ファイル名を 1 行に 1 つずつ出力します。また、grep がそのほとんどを破棄するために、再帰的なディレクトリ構造全体を生成して出力する必要がないため、はるかに高速になります。

find . -name "file_for_print*"

実際にはまったく同じです

find . -name "file_for_print*" -print

アクションは、-print一致した各ファイル名の後に改行を出力します。アクションを指定しない場合はfind、必要であると見なされます-print。しかし、それよりも多くのトリックが用意されています。例えば:

find . -name "file_for_print*" -exec cat {} \;

この-execアクションにより、find は次のコマンドを まで実行し、一致する各ファイル名\;に置き換えます。{}

find単一のアクションに限定されません。必要なだけ実行するように指示できます。そう:

find . -name "file_for_print*" -print -exec cat {} \;

おそらくあなたが望むことはかなりうまくいくでしょう。

この非常に便利なユーティリティの詳細については、次のように入力してください。

man find

また

info find

それについてすべて読んでください。

于 2013-09-11T02:26:03.713 に答える
10

まだ言われていないので: -I %'%' を指定したコマンドの引数に置き換えるように xargs に指示します。正当な手段は、新しいシェルでsh -c '...'コマンドを実行することです。'...'

そう

xargs -I % sh -c 'echo %; cat %;'

に指定されたすべてのファイル名に対して、が実行echo [filename]されます。echo コマンドと cat コマンドは別のシェル プロセス内で実行されますが、通常は問題になりません。に渡されたコマンド内の記号が欠落していたため、バージョンは機能しませんでした。cat [filename]xargs%xargs


価値があるのは、このコマンドを使用して同じことを達成することです。

find -name "*file_for_print*" | parallel 'echo {}; cat {};'

それはより単純だからです (parallelは自動的{}に置換文字として使用され、デフォルトで複数のコマンドを受け取ることができます)。

于 2014-02-07T11:23:01.320 に答える
2

この特定のケースでは、とにかく各コマンドが個々のファイルごとに実行されるため、xargs を使用する利点はありません。「検索」に -exec を2回追加するだけです。

find . -name "*file_for_print*" -exec echo {} \; -exec cat {} \;

この場合、rici によって指摘され-printた最初のコマンドの代わりに使用できますが、この例は、1 つのコマンドで 2 つの任意のコマンドを実行できることを示しています。echofind

于 2014-02-12T08:04:34.453 に答える
0

独自の bash 関数を作成するのはどうですか?

#!/bin/bash

myFunction() {
    while read -r file; do
        echo "$file"
        cat "$file"
    done
}

find . -name "file_for_print*" | myFunction
于 2013-09-11T15:39:27.233 に答える