Unix 如何使用find命令从列表中查找所有扩展名为的文件?
我需要找到目录中的所有图像文件(gif、png、jpg、jpeg) 如何修改此字符串以不仅查找.jpg文件Unix 如何使用find命令从列表中查找所有扩展名为的文件?,unix,shell,find,Unix,Shell,Find,我需要找到目录中的所有图像文件(gif、png、jpg、jpeg) 如何修改此字符串以不仅查找.jpg文件 find /path/to/ \( -iname '*.gif' -o -iname '*.jpg' \) -print0 会有用的。也许还有更优雅的方式 find /path -type f \( -iname "*.jpg" -o -name "*.jpeg" -o -iname "*gif" \) 这将使用file命令尝试识别文件类型,而不考虑文件名(或扩展名) 如果/path
find /path/to/ \( -iname '*.gif' -o -iname '*.jpg' \) -print0
会有用的。也许还有更优雅的方式
find /path -type f \( -iname "*.jpg" -o -name "*.jpeg" -o -iname "*gif" \)
这将使用file
命令尝试识别文件类型,而不考虑文件名(或扩展名)
如果/path/to
或文件名包含字符串image
,则上述内容可能会返回虚假点击。那样的话,我建议
cd /path/to
find . -type f -print0 | xargs -0 file --mime-type | grep -i image/
find-E/path/to-regex.*\(jpg | gif | png | jpeg)>log
-E
使您不必转义正则表达式中的paren和管道。作为对上面@Dennis Williamson响应的补充,如果您希望相同的正则表达式对文件扩展名不区分大小写,请使用-iregex:
find -regex ".*\.\(jpg\|gif\|png\|jpeg\)"
find /path/to -iregex ".*\.\(jpg\|gif\|png\|jpeg\)" > log
关于Mac OS的使用
find -E packages -regex ".*\.(jpg|gif|png|jpeg)"
如果文件没有扩展名,我们可以查找文件mime类型
find . -type f -exec file -i {} + | awk -F': +' '{ if ($2 ~ /audio|video|matroska|mpeg/) print $1 }'
其中(音频|视频| 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
注意而不是~——在南部就是这样insensitive@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
我的find没有这个-EHmmm-E
选项告诉find
使用“扩展正则表达式”。其他几个工具也有类似的选项,但我不确定此选项是否在所有UNIX发行版上都可用。它也适用于Mac OS。@tboyce12在ubuntu上工作时,我可以指定-regextype来简化正则表达式:find-regextype posix extended-regex.*\(jpg | gif | png | jpeg)
@cjm Maybefind-E/path/to-iregex.*\(jpg | gif | png | jpeg)>log
。使用-iregex
标志告诉find
不区分大小写匹配。在mac上不适用于我,但可以使用-E(扩展)选项(可能管道是扩展功能?):find-E/path/to-iregex.*\(jpg | gif | png | jpeg)>log对不起,在那里单击错误,我显然无法撤消否决票…:(您能解释一下为什么在name/iname参数周围添加了(转义)括号吗?有什么不一致的原因吗?-iname*.jpg
,-o-name*.jpeg
,-o-iname*gif
都有一个稍微不同的格式。如果您至少可以用其他答案解释不同之处的话。
find . -type f -exec file -i {} + | awk -F': +' '{ if ($2 ~ /audio|video|matroska|mpeg/) print $1 }'
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