findとgrepで使われるexecオプションの使い方

findgrepコマンドで使われる-execオプションは

実行結果を他のコマンドに渡すためのオプション。

 

以下のどちらかのように書く。

find  -exec コマンド {} \;

find  -exec コマンド {} +;

 

前者と後者の違いは

  • 前者:結果を一つずつ渡す
  • 後者:結果をまとめて渡す

という違い。

 

例えば、以下のようなディレクトリ下を想定する。

$ ls
filea  fileb  filec

 

この状況下で、以下のように書くと「findで見つけたファイルの一覧をechoに渡す」みたいなことができる。

$ find . -type f -exec echo {} \;
./fileb
./filea
./filec
$ find . -type f -exec echo {} +;
./fileb ./filea ./filec
  • 前者では、見つかったファイルを一つずつechoに渡しているので、echoが3回実行されている。
  • 後者では、見つかったファイルをまとめてechoに渡しているので、echoが1回だけ実行されている。

 

その他メモ。

  • {}の部分に「実行結果」が入るみたいなイメージ。
  • \;はコマンド区切り記号である;と区別するためにエスケープしてるらしい。
  • +;はこれ一つでセットなので、エスケープする必要がない。
  • xargsコマンドとexecオプションはほとんど同じ。オプションによってはまったく同じ。むしろxargsコマンドのほうが基本的に早いらしいので、xargsを使ったほうがいい。

 

execオプションは以下のようにつなげる事もできる。

find -exec egrep -i '(secret|confidential)' '{}' \; -exec cp '{}' . \;

このように書くと

  1. findコマンドで、すべてのファイルを検索し、その結果をegrepコマンドに渡す。
  2. egrepコマンドは、渡されたファイルからsecretconfidentialという文字(大文字小文字関係なし)が入っているファイルを探し、その結果をcpコマンドに渡す。
  3. cpコマンドは、渡されたファイル(secretconfidentialという文字が入っているファイル)をカレントディレクトリにコピーする。

みたいなことができる。

 

execオプションを使わずに、xargsコマンドを使う方法もある。

以下の2つは同じ意味。

$ find . -type f -exec echo {} +;

$ find . -type f | xargs echo;

xargsのほうが色々なオプションがあって、機能的に優れているっぽい。

 

おわり

Linux
スポンサーリンク
この記事を書いた人
penpen

1991生まれ。WEBエンジニア。

技術スタック:TypeScript/Next.js/Express/Docker/AWS

フォローする
フォローする

コメント

タイトルとURLをコピーしました