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
のほうが色々なオプションがあって、機能的に優れているっぽい。
おわり
コメント