Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 如何使用find命令从列表中查找所有扩展名为的文件?_Unix_Shell_Find - Fatal编程技术网

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

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

我需要找到目录中的所有图像文件(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/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 Maybe
find-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