如何使用 find 命令搜索多个扩展名

won*_*ng2 210 find regular-expression

我可以jpg使用以下方法获取所有图像:

find . -name "*.jpg"  
Run Code Online (Sandbox Code Playgroud)

但是我怎样才能将png文件添加到结果中呢?

Sha*_*dur 246

-o在不同参数之间使用标志。

find ./ -type f \( -iname \*.jpg -o -iname \*.png \) 奇迹般有效。

注意必须是支架和它的内容之间的空间,否则将无法正常工作。

解释:

  • -type f - 只搜索文件(不是目录)
  • \(& \)- 需要-type f应用于所有参数
  • -o - 逻辑或运算符
  • -iname- 类似-name,但匹配不区分大小写

  • @miked 如果没有它们,该命令将“工作”,是的,但是您最终会点击以 .png 结尾的目录以及以 .jpg 结尾的文件,这并不完全符合预期。 (3认同)
  • 这是运算符优先级的问题。就像`a * b + c` 不同于`a * (b + c)` (3认同)
  • 需要括号吗。没有它们,该命令对我也有效。某些 shell 需要它们吗? (2认同)

Gil*_*il' 111

您可以结合标准-o通过Shadur建议。请注意,-o它的优先级低于并列,因此您可能需要括号。

find . -name '*.jpg' -o -name '*.png'
find . -mtime -7 \( '*.jpg' -o -name '*.png' \)  # all .jpg or .png images modified in the past week
Run Code Online (Sandbox Code Playgroud)

在 Linux 上,您可以使用-regex更简洁的方式组合扩展。默认的正则表达式语法是 Emacs(基本正则表达式加上一些扩展,例如\|交替);有一个选项可以切换到扩展 regexps

find -regex '.*\.\(jpg\|png\)'
find -regextype posix-extended -regex '.*\.(jpg|png)'
Run Code Online (Sandbox Code Playgroud)

在 FreeBSD、NetBSD 和 OSX 上,您可以-regex结合使用-E扩展正则表达式。

find -E . -regex '.*\.(jpg|png)'
Run Code Online (Sandbox Code Playgroud)

  • 使用`-iname` 代替`-name` 总是更好——这样你也将捕获`image.JPG` 和`image.PnG` (4认同)

小智 53

这是更正确的:

find . -iregex '.*\.\(jpg\|gif\|png\|jpeg\)$'
Run Code Online (Sandbox Code Playgroud)

  • 为什么说它“更多”是正确的? (13认同)
  • @Kevin 我猜是因为`-iregex` 匹配`jpg` 以及`JPG Jpg jpG` 等。我认为不需要`$`。 (4认同)
  • 首先,您省略了搜索文件夹作为第一个参数,这将引发错误。其次,在 OSX 上,转义括号不起作用,应该使用它:`find -E。-iregex '.*\.(jpg|png|gif)'` 如@sorin 的回答所示。 (2认同)

sor*_*rin 15

明确地说,适用于 Linux、Unix 和 macOS 风格的唯一选项是:

find -E . -regex '.*\.(jpg|png)'
Run Code Online (Sandbox Code Playgroud)

那是因为 OS X 版本略有不同,但这对于编写在大多数平台上运行良好的东西很重要。

  • -E 标志对于在 Ubuntu 14.04 上查找无效 (4认同)