如何使用find命令从列表中查找所有带有扩展名的文件?


179

我需要从目录(gif,png,jpg,jpeg)中找到所有图像文件。

find /path/to/ -name "*.jpg" > log

如何修改此字符串以查找不仅.jpg文件?

Answers:


189
find /path/to -regex ".*\.\(jpg\|gif\|png\|jpeg\)" > log

6
在Mac上不适用于我,但可以使用-E(扩展)选项(也许管道是扩展功能?):find -E / path / to -iregex“。* \。(jpg | gif | png | jpeg)“>日志
ling

138
find /path/to/  \( -iname '*.gif' -o -iname '*.jpg' \) -print0

将工作。可能会有更优雅的方式。


16
-iname不区分大小写
克里斯·科斯顿

1
@Gerald:您可能需要将OR表达式放在转义括号中:find /path/to/ \( -iname '*.gif' -o -iname '*.jpg' \) -exec ls -l {} \;否则,exec仅适用于最后一部分(-iname '*.jpg' 在这种情况下)。
暂停,直到另行通知。

这是重要的一句话。find /path/to/ -iname '*.gif' -o -iname '*.jpg' -print0将只打印jpg文件!您需要在这里find /path/to/ \( -iname '*.gif' -o -iname '*.jpg' \) -print0
加上

28

find -E /path/to -regex ".*\.(jpg|gif|png|jpeg)" > log

这样就使-E您不必逃脱正则表达式中的括号和管道。


2
我的发现没有这个-E
wieczorek1990

1
嗯,该-E选项告诉find您使用“扩展正则表达式”。其他几种工具也有类似的选项,但是我不确定该选项是否在所有UNIX发行版中都可用。
tboyce12

8
也可以在Mac OS上使用。
c.gutierrez 2014年

2
@ tboyce12工作在Ubuntu,我可以指定-regextype简化正则表达式:find . -regextype posix-extended -regex ".*\.(jpg|gif|png|jpeg)"
doub1ejack

1
@cjm也许吧find -E /path/to -iregex ".*\.(jpg|gif|png|jpeg)" > log。使用该-iregex标志find可以区分大小写。
tboyce12

11
find /path/to/ -type f -print0 | xargs -0 file | grep -i image

这使用file命令来尝试识别文件的类型,而不管文件名(或扩展名)如何。

如果/path/to或文件名包含字符串image,则以上内容可能会返回假匹配。在这种情况下,我建议

cd /path/to
find . -type f -print0 | xargs -0 file --mime-type | grep -i image/

抱歉,在那儿有一个错误的点击,我显然无法撤消下降投票... :(
Mark Simpson

6
find /path -type f \( -iname "*.jpg" -o -name "*.jpeg" -o -iname "*gif" \)

2
您能否解释一下为什么在name / iname参数周围添加(转义)括号?
Bart Kleijngeld

不一致的任何原因?-iname *.jpg-o -name *.jpeg-o -iname *gif都有着一个稍微不同的格式。
被遗弃的购物车

如果您至少可以用其他答案解释差异。
el-teedee '19年

6

除了上述@Dennis Williamson的响应之外,如果您希望同一个正则表达式对文件扩展名不区分大小写,请使用-iregex:

find /path/to -iregex ".*\.\(jpg\|gif\|png\|jpeg\)" > log

5

在Mac OS上使用

find -E packages  -regex ".*\.(jpg|gif|png|jpeg)"


-1

如果文件没有扩展名,我们可以寻找文件的MIME类型

find . -type f -exec file -i {} + | awk -F': +' '{ if ($2 ~ /audio|video|matroska|mpeg/) print $1 }'

其中(audio | video | matroska | mpeg)是MIME类型regex

&如果您要删除它们:

find . -type f -exec file -i {} + | awk -F': +' '{ if ($2 ~ /audio|video|matroska|mpeg/) print $1 }' | while read f ; do
  rm "$f"
done

或删除除这些扩展名以外的所有内容:

find . -type f -exec file -i {} + | awk -F': +' '{ if ($2 !~ /audio|video|matroska|mpeg/) print $1 }' | while read f ; do
  rm "$f"
done

注意!〜而不是〜

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.