让 find 中的 -exec 选项发挥作用

让 find 中的 -exec 选项发挥作用

我试图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 {} \;

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

  1. {}和之间必须有一个空格\;
  2. 必须;转义,因为它是 shell 元字符。
  3. 正如 @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"

相关内容