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

Posted

技术标签:

【中文标题】如何使用 find 命令从列表中查找所有带有扩展名的文件?【英文标题】:How to use find command to find all files with extensions from list? 【发布时间】:2011-02-06 23:15:24 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:
find /path/to -regex ".*\.\(jpg\|gif\|png\|jpeg\)" > log

【讨论】:

在 mac 上不适用于我,但可以使用 -E(扩展)选项(也许管道是扩展功能?):find -E /path/to -iregex ".*\ .(jpg|gif|png|jpeg)" > 日志【参考方案2】:
find /path/to/  \( -iname '*.gif' -o -iname '*.jpg' \) -print0

会起作用。可能有更优雅的方式。

【讨论】:

-iname 不区分大小写 @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【参考方案3】:

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

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

【讨论】:

我的发现没有这个-E 嗯,-E 选项告诉find 使用“扩展正则表达式”。其他几个工具也有类似的选项,但我不确定这个选项是否适用于所有 UNIX 发行版。 也适用于 Mac OS。 @tboyce12 在 ubuntu 上工作,我可以指定 -regextype 来简化正则表达式:find . -regextype posix-extended -regex ".*\.(jpg|gif|png|jpeg)" @cjm 也许find -E /path/to -iregex ".*\.(jpg|gif|png|jpeg)" > log。使用-iregex 标志告诉find 不区分大小写。【参考方案4】:
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/

【讨论】:

抱歉,点击错误,我显然无法撤消反对票... :(【参考方案5】:
find /path -type f \( -iname "*.jpg" -o -name "*.jpeg" -o -iname "*gif" \)

【讨论】:

您能解释一下为什么在 name/iname 参数周围添加(转义)括号吗? 不一致有什么原因吗? -iname *.jpg-o -name *.jpeg-o -iname *gif 的格式都略有不同。 如果您至少可以解释与其他答案的不同之处。【参考方案6】:

在 Mac OS 上使用

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

【讨论】:

【参考方案7】:

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

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

【讨论】:

【参考方案8】:
find -regex ".*\.\(jpg\|gif\|png\|jpeg\)"

【讨论】:

【参考方案9】:

如果文件没有扩展名,我们可以查找文件 mime 类型

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

其中 (audio|video|matroska|mpeg) 是 mime 类型的正则表达式

&如果你想删除它们:

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

注意 !~ 而不是 ~

【讨论】:

【参考方案10】:

添加-regextype posix-extended 选项在我的情况下有效:

sudo find . -regextype posix-extended -regex ".*\.(css|js|jpg|jpeg|png|ico|ttf|woff|svg)" -exec chmod 0640  \;

【讨论】:

以上是关于如何使用 find 命令从列表中查找所有带有扩展名的文件?的主要内容,如果未能解决你的问题,请参考以下文章

find命令

linux find命令查找当前目录下7天前的文件但排除所有目录

如何使用find命令查找文件?

从 find(shell) 命令中删除一些输出行

2.4文件查找与文件列表

Shell find命令详解