Answers:
find /path/to -regex ".*\.\(jpg\|gif\|png\|jpeg\)" > log
find /path/to/ \( -iname '*.gif' -o -iname '*.jpg' \) -print0
将工作。可能会有更优雅的方式。
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 -E /path/to -regex ".*\.(jpg|gif|png|jpeg)" > log
这样就使-E
您不必逃脱正则表达式中的括号和管道。
-E
选项告诉find
您使用“扩展正则表达式”。其他几种工具也有类似的选项,但是我不确定该选项是否在所有UNIX发行版中都可用。
find . -regextype posix-extended -regex ".*\.(jpg|gif|png|jpeg)"
。
find -E /path/to -iregex ".*\.(jpg|gif|png|jpeg)" > log
。使用该-iregex
标志find
可以区分大小写。
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/
find /path -type f \( -iname "*.jpg" -o -name "*.jpeg" -o -iname "*gif" \)
-iname *.jpg
,-o -name *.jpeg
,-o -iname *gif
都有着一个稍微不同的格式。
如果文件没有扩展名,我们可以寻找文件的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
注意!〜而不是〜