我试图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)
A-exec
需要以 a;
或 a结尾+
。这;
导致命令对每个找到的文件名执行一次,而+
导致对所有文件名执行一次命令。
这是一个工作示例:
find ! -iname "*.JPG" -exec dirname {} \;
Run Code Online (Sandbox Code Playgroud)
与您的尝试有一些显着差异:
{}
和之间必须有一个空格\;
;
必须进行转义,因为它是一个shell元字符。-iname
需要一个 glob,而不是一个正则表达式语法:
-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)