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


Answers:


152

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

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

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

说明:

  • type -f -仅搜索文件(不搜索目录)
  • \(- type -f适用于所有参数
  • -o -逻辑或运算符
  • -iname- -name,但匹配项不区分大小写

您需要括号吗?没有它们,该命令对我有用。是否需要一些外壳?
MikeD

2
@miked该命令将在没有它们的情况下“起作用”,是的,但是您最终会得到以.png结尾的目录以及以.jpg结尾的文件的命中,这不完全是我们想要的。
Shadur

1
感谢您的澄清!在type -f不扩展,适用于没有括号两个表达式,所以,find ./ -type f -iname \*.jpg -o -type f -iname \*.png也适用......虽然这是两个字符长:-)
拾音

2
这是运算符优先级的问题。就像a * b + c不同于a * (b + c)
Shadur

2
@jdhao好捕获,已修改。
Shadur

85

您可以结合标准-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

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

find -regex '.*\.\(jpg\|png\)'
find -regextype posix-extended -regex '.*\.(jpg|png)'

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

find -E . -regex '.*\.(jpg|png)'

最好使用它来-iname代替-name—然后您还将捕获image.JPGimage.PnG
ccpizza

40

这更正确:

find . -iregex '.*\.\(jpg\|gif\|png\|jpeg\)$'

10
您为什么说它“更多”正确?
凯文(Kevin)

2
@Kevin我猜是因为-iregex相匹配jpg,以及JPG Jpg jpG与这样的。我认为$不需要。
ott--

这在MinGW上工作正常。
彼得·莫滕森

2
首先,您省略了搜索文件夹作为第一个参数,这将引发错误。其次,在OSX上,转义括号是行不通的,而应改为使用:find -E . -iregex '.*\.(jpg|png|gif)'如@sorin的答案所示。
ccpizza

8

为了明确起见,在Linux,Unix和macOS风格上可用的唯一选项是:

find -E . -regex '.*\.(jpg|png)'

这是因为OS X版本略有不同,但是编写在大多数平台上都能正常运行的东西很重要。


2
-E标志不适用于Ubuntu 14.04
gogaman

-E标志在MinGW上也无效(至少我尝试过的版本/配置(特定版本的默认配置))。
彼得·莫滕森

哪一部分-type f \( -iname \*.png -o -iname \*.jpg\)在OSX 上不起作用?
Shadur

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.