findやgrepコマンドで使われる-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 '{}' . \;
このように書くと
findコマンドで、すべてのファイルを検索し、その結果をegrepコマンドに渡す。egrepコマンドは、渡されたファイルからsecretかconfidentialという文字(大文字小文字関係なし)が入っているファイルを探し、その結果をcpコマンドに渡す。cpコマンドは、渡されたファイル(secretかconfidentialという文字が入っているファイル)をカレントディレクトリにコピーする。
みたいなことができる。
execオプションを使わずに、xargsコマンドを使う方法もある。
以下の2つは同じ意味。
$ find . -type f -exec echo {} +;
$ find . -type f | xargs echo;
xargsのほうが色々なオプションがあって、機能的に優れているっぽい。
おわり
コメント