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

时间:2010-04-12 11:07:20

标签: unix shell find

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

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

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

9 个答案:

答案 0 :(得分:163)

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

答案 1 :(得分:126)

find /path/to/ -iname '*.gif' -o -iname '*.jpg' -o -iname '*.png' -o -iname '*.jpeg'

会奏效。可能会有更优雅的方式。

答案 2 :(得分:24)

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

-E使您无需逃离正则表达式中的parens和pipe。

答案 3 :(得分: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/

答案 4 :(得分:6)

作为@Dennis Williamson上述回复的补充,如果您希望相同的正则表达式对文件扩展名不区分大小写,请使用-iregex:

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

答案 5 :(得分:5)

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

答案 6 :(得分:1)

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

答案 7 :(得分:1)

在Mac OS上使用

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

答案 8 :(得分:-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

注意!〜而不是〜