![让 find 中的 -exec 选项发挥作用](https://linux22.com/image/35965/%E8%AE%A9%20find%20%E4%B8%AD%E7%9A%84%20-exec%20%E9%80%89%E9%A1%B9%E5%8F%91%E6%8C%A5%E4%BD%9C%E7%94%A8.png)
我试图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 {} \;
与您的尝试有一些显着的差异:
{}
和之间必须有一个空格\;
- 必须
;
转义,因为它是 shell 元字符。 - 正如 @muru 在他的回答中指出的那样,
-iname
采用 glob,而不是正则表达式
答案2
尝试:
find -type f ! -iname "*.JPG" -exec dirname {} \; | sort -u
笔记;
要完成该
-exec
命令,{}
需要 a 来显示文件名应该放在哪里和需要一个分号。因为 shell 会吃掉普通的分号,所以我们必须对其进行转义,以便将其传递给find
。-iname
匹配全局变量,而不是正则表达式。所以,最后的结果$
可能"*.JPG$"
不是你想要的。您说您想要一个“包含 jpg 以外的文件的目录列表”。因此,我添加了
-type f
这一内容,以便确保我们只查看至少包含一个文件的目录。结果被通过
sort -u
以删除重复项。
答案3
语法:
-exec [command] ... {} ... ;
-exec [command] ... {} ... +
由于;
是 shell 语法的一部分,因此您需要对其进行转义,以便find
将其视为参数:
find .. -exec dirname {} \;
顺便说一句,-iname
不使用正则表达式 - 只需使用*.jpg
不带$
.
dirname
现在我突然意识到,有了 GNU find,我们就根本不需要使用它了。反而:
find ... -printf "%h\n"