bash - 何ができますか: find .... - この&&それを実行しますか?

bash - 何ができますか: find .... - この&&それを実行しますか?

2つのシェルコマンドを論理的に結合する方法はありますか?検索 - 実行

たとえば、すべて印刷してみてください。.csv文字列fooとその発生回数を含むファイルを使用して、次のことをしたいと思います。

find . -iname \*.csv -exec grep foo {} && echo {} \;

しかし、強く打つ「'-exec' 引数の欠落」について文句を言います。

答え1

-execシェルではなくコマンドを実行して結果を計算する述語です。本物または間違ったコマンドの結果(0または0以外の終了状態)に基づいています。

だから:

find . -iname '*.csv' -exec grep foo {} \; -print

会議印刷grepファイルにfooがある場合のファイルパス。代わりに、別の述語または別の述語を-print使用できます。-exec

find . -iname '*.csv' -exec grep foo {} \; -exec echo {} \;

負の合計の演算子も参照し!て見つけてください。-oまたは

または、次のようにシェルを起動できます。

find . -iname '*.csv' -exec sh -c '
   grep foo "$1" && echo "$1"' sh {} \;

または、各ファイルに対してシェルを起動しないでください。

find . -iname '*.csv' -exec sh -c '
  for file do
    grep foo "$file" && echo "$file"
  done' sh {} +

答え2

直面する問題は、シェルが最初にコマンドラインを解析し、&&演算子で区切られた2つの単純なコマンド(find . -iname \*.csv -exec grep foo {}、、および)を見ることですecho {} \;。 ()を引用すると&&これは無視されfind . -iname \*.csv -exec grep foo {} '&&' echo {} \;ますが、今や引数を使用して同様のfindコマンドを実行します。この演算子を解釈するシェルを実行するように指示する必要があります。grepfoowibble.csv&&echowibble.csvfind&&

find . -iname \*.csv -exec sh -c 'grep foo "$0" && echo "$0"' {} \;

sh -c SOMECOMMANDisの後の最初のパラメータで$0はありません$1

処理を容易にするには、ファイル名を列挙できる-exec … +ようにいくつかのダミー値を渡します。$0"$@"

find . -iname \*.csv -exec sh -c 'for x in "$@"; do grep foo "$x" && echo "$x"; done' \ {} +

シェルコマンドが2つのプログラムに分割された2つのプログラムである場合は、&&これをfind直接実行できます。 2 つの連続-execジョブを作成し、最初のジョブが状態 0 で終了した場合にのみ、2 番目のジョブを実行します。

find . -iname \*.csv -exec grep foo {} \; -exec echo {} \;

(私は単に説明のためにgrepandを使用してandに置き換えることができると仮定します。結果出力はとにかく特に有用ではありません。)echo-exec echo-print

答え3

この特別な場合には、次のようにします。

find . -iname \*.csv -exec grep -l foo \{\} \;

またはあなたが持っているなら確認する:

ack -al -G '.*\.csv' foo

実際の質問に答えるには、次のようにします。

find . -iname \*.csv -exec sh -c "grep foo {} && echo {}" \;

関連情報