
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
はまたは-exec
で終了する必要があります。 は、見つかったファイル名ごとにコマンドを 1 回実行しますが、 は、すべてのファイル名に対してコマンドを 1 回実行します。;
+
;
+
実際の例は以下になります:
find ! -iname "*.JPG" -exec dirname {} \;
あなたの試みとのいくつかの注目すべき違い:
{}
との間にはスペースが必要です\;
;
これはシェルのメタ文字なのでエスケープする必要があります。- @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
なしで使用します。$
dirname
GNU find では、まったく使用する必要がないことに今気づきました。代わりに:
find ... -printf "%h\n"