让 find 中的 -exec 选项起作用

id0*_*id0 5 find

我试图find打印出包含 jpg 图像以外的文件的目录列表,但我认为我对该-exec选项的使用被破坏了。我的环境是 Cygwin Bash。

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

find: missing argument to `-exec'
Run Code Online (Sandbox Code Playgroud)
$ find ! -iname "*.JPG$" -exec dirname {}

find: missing argument to `-exec'
Run Code Online (Sandbox Code Playgroud)
$ find ! -iname "*.JPG$" -exec dirname;

find: missing argument to `-exec'
Run Code Online (Sandbox Code Playgroud)
$ find ! -iname "*.JPG$" -exec dirname ;

find: missing argument to `-exec'
Run Code Online (Sandbox Code Playgroud)
$ find ! -iname "*.JPG$" -exec dirname {};

find: missing argument to `-exec'
Run Code Online (Sandbox Code Playgroud)

jor*_*anm 8

A-exec需要以 a;或 a结尾+。这;导致命令对每个找到的文件名执行一次,而+导致对所有文件名执行一次命令。

这是一个工作示例:

find ! -iname "*.JPG" -exec dirname {} \;
Run Code Online (Sandbox Code Playgroud)

与您的尝试有一些显着差异:

  1. {}和之间必须有一个空格\;
  2. ;必须进行转义,因为它是一个shell元字符。
  3. 正如@muru 在他的回答中指出的,-iname需要一个 glob,而不是一个正则表达式


mur*_*uru 3

语法:

-exec [command] ... {} ... ;
-exec [command] ... {} ... +
Run Code Online (Sandbox Code Playgroud)

由于;是 shell 语法的一部分,因此您需要对其进行转义,以便find将其视为参数:

find .. -exec dirname {} \;
Run Code Online (Sandbox Code Playgroud)

顺便说一句,-iname不使用正则表达式 - 只需使用*.jpg不带$.


dirname现在我突然意识到,有了 GNU find,我们就根本不需要使用它了。反而:

find ... -printf "%h\n"
Run Code Online (Sandbox Code Playgroud)