58

在这个庞大的存档中有很多类型的图形图像,例如.jpg、.gif、.png 等。我不知道所有类型。有没有办法让“查找”能够列出所有图形图像,而不管它们的点扩展名是什么?谢谢!

4

6 回答 6

71

这应该可以解决问题

find . -name '*' -exec file {} \; | grep -o -P '^.+: \w+ image'

示例输出:

./navigation/doc/Sphärische_Trigonometrie-Dateien/bfc9bd9372f650fd158992cf5948debe.png: PNG image
./navigation/doc/Sphärische_Trigonometrie-Dateien/6564ce3c5b95ded313b84fa918b32776.png: PNG image
./navigation/doc/subr_1.jpe: JPEG image
./navigation/doc/Astroanalytisch-Dateien/Gamma.gif: GIF image
./navigation/doc/Astroanalytisch-Dateien/deltaS.jpg: JPEG image
./navigation/doc/Astroanalytisch-Dateien/GammaBau.jpg: JPEG image
于 2013-05-26T10:42:13.580 回答
36

以下更适合我,因为在我的情况下,我想将此文件列表通过管道传输到另一个程序。

find . -type f -exec file --mime-type {} \+ | awk -F: '{if ($2 ~/image\//) print $1}'

如果您想将图像压缩(如评论中的某人)问

find . -type f -exec file --mime-type {} \+ | awk -F: '{if ($2 ~/image\//) printf("%s%c", $1, 0)}' | tar -cvf /tmp/file.tar --null -T -
于 2014-07-22T05:13:05.553 回答
12
find . -type f -exec file {} \; | grep -o -P '^.+: \w+ image'

甚至应该更好。

于 2013-09-25T15:56:19.353 回答
8

仅将 awk 用于“图像”将不会这样做。PSD 文件将由带有大写“I”的“Image”标识,因此我们需要改进正则表达式,使其不区分大小写或还包含大写 I。EPS 文件根本不包含“image”一词,所以我们根据您的需要,还需要匹配“EPS”或“Postscript”。所以这是我的改进版本:

find . -type f -exec file {} \; | awk -F: '{ if ($2 ~/[Ii]mage|EPS/) print $1}'
于 2015-02-18T09:13:47.853 回答
3

更新 (2022-03-03)

这是一个经过改进的版本,具有以下更改:

  1. 删除xargs.
  2. 支持包含:基于林果皞评论的文件名。
find . -type f |
  file --mime-type -f - |
  grep -F image/ |
  rev | cut -d : -f 2- | rev

与所选答案相比,以下是一个性能更高的解决方案:

find . -type f -print0 |
  xargs -0 file --mime-type |
  grep -F 'image/' |
  cut -d ':' -f 1
  1. 使用-type f代替,-name '*'因为前者将只搜索文件,而后者搜索文件和目录。
  2. xargsfile使用尽可能多的参数执行,这与为每个找到find -exec file {} \;的执行相比非常快。file
  3. grep -F更快,因为我们只想匹配固定字符串。
  4. cutawk(我记得快 5 倍多)。
于 2020-03-06T08:14:34.817 回答
1

与同样的问题相关,我刚刚发布了一个名为photofind的工具(https://github.com/trimap/photofind)。它的行为类似于普通的查找命令,但专门用于图像文件,并且还支持基于图像文件中存储的 EXIF 信息的结果过滤。有关更多详细信息,请参阅链接的 github-repo。

于 2017-09-11T05:55:36.993 回答