検索操作で-execオプションを使用してください。

検索操作で-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

Aはaまたはaで終わらなければなりません-exec。見つかった各ファイル名に対してコマンドは一度実行されますが、すべてのファイル名に対してコマンドは一度実行されます。;+;+

以下は実際の例です。

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

あなたの試みとはいくつかの注目すべき違いがあります。

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

答え2

努力する:

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

ノート;

  • -execコマンドを完了するには、{}ファイル名の場所を表示するために必要です。そしてセミコロンが必要です。シェルは通常のセミコロンを食べるので、それをに渡すにはエスケープする必要がありますfind

  • -iname正規表現ではなくグローバル変数を照合します。したがって、最終結果が望ましい結果ではない可能性が$あります。"*.JPG$"

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

  • 重複を排除するために結果が渡されましたsort -u

答え3

文法:

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

これはシェル構文の一部であるため、パラメータとして処理されるように;エスケープする必要があります。find

find .. -exec dirname {} \;

ところで、-iname正規表現を使用しないでください。*.jpgなしで使用してください$


dirnameさて、突然GNU findを使用すると、それをまったく使用する必要はないと思いました。代わりに:

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

関連情報