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生まれ。
2019年くらいからフロントエンドエンジニアを目指している元アフィリエイターです💩

penpenをフォローする
penpenをフォローする
penpenメモ

コメント

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