find の -exec オプションを機能させる

find の -exec オプションを機能させる

findjpg 画像以外のファイルを含むディレクトリのリストを印刷しようとしていますが、-execオプションの使用方法が間違っていると思います。私の環境は Cygwin Bash です。

$ find ! -iname "*.JPG$" -exec dirname

find: missing argument to `-exec'
$ find ! -iname "*.JPG$" -exec dirname {}

find: missing argument to `-exec'
$ find ! -iname "*.JPG$" -exec dirname;

find: missing argument to `-exec'
$ find ! -iname "*.JPG$" -exec dirname ;

find: missing argument to `-exec'
$ find ! -iname "*.JPG$" -exec dirname {};

find: missing argument to `-exec'

答え1

はまたは-execで終了する必要があります。 は、見つかったファイル名ごとにコマンドを 1 回実行しますが、 は、すべてのファイル名に対してコマンドを 1 回実行します。;+;+

実際の例は以下になります:

find ! -iname "*.JPG" -exec dirname {} \;

あなたの試みとのいくつかの注目すべき違い:

  1. {}との間にはスペースが必要です\;
  2. ;これはシェルのメタ文字なのでエスケープする必要があります。
  3. @muruが回答で指摘したように、-iname正規表現ではなくグロブを使用します

答え2

試す:

find -type f ! -iname "*.JPG" -exec dirname {} \; | sort -u

ノート;

  • コマンドを完了するには-exec{}ファイル名がどこに置かれるかを示すために が必要です。そしてセミコロンが必要です。シェルは単純なセミコロンを処理してしまうため、 に渡されるようにエスケープする必要がありますfind

  • -iname正規表現ではなく、グロブに一致します。したがって、最後の$in は"*.JPG$"おそらく必要なものではないでしょう。

  • 「jpg 以外のファイルを含むディレクトリのリスト」が欲しいとのことでした。したがって、-type f少なくとも 1 つのファイルを含むディレクトリのみを確認するように追加しました。

  • 結果はsort -u重複を削除するために処理されます。

答え3

構文:

-exec [command] ... {} ... ;
-exec [command] ... {} ... +

はシェル構文の一部なので、引数として認識される;ようにエスケープする必要があります。find

find .. -exec dirname {} \;

ちなみに、-inameは正規表現を使用しません。.*.jpgなしで使用します。$


dirnameGNU find では、まったく使用する必要がないことに今気づきました。代わりに:

find ... -printf "%h\n"

関連情報