
find
jpg画像以外のファイルを含むディレクトリのリストを印刷しようとしていますが、-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 {} \;
あなたの試みとはいくつかの注目すべき違いがあります。
{}
の間にスペースが必要です。\;
;
シェルメタ文字なので、エスケープする必要があります。- @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"