如何使用命令行仅列出下面根目录中的 JPEG 文件?

如何使用命令行仅列出下面根目录中的 JPEG 文件?

我正在寻找一种只查找 JPEG 文件的方法/由于我对 Linux 的了解有限,我得出了这一点:

  1. 列出下面从根目录存在的所有路径find /
  2. 将结果通过管道传输到下一个命令,并file在每个找到的路径上执行该命令xargs file
  3. 在命令的结果中file包含一个 JPEG 字符串,我想也许 IF 语句可以以某种方式仅过滤 JPEG: If (JPEG contains in output of file command) {show argument of file}

再一次:

find / | xargs file | "If statement" 

您能否纠正我,给我一个如何执行任务的提示或给出解决方案?

答案1

如果您想列出包含 JPEG 图像的文件,而不管文件名中的扩展名如何,您可以使用find+file列出 mime 类型的文件image/jpeg

find . -type f -exec sh -c '
    file --mime-type "$0" | grep -q image/jpeg\$ && printf "$0\n"
' {} \;

或者

find . -type f -exec sh -c '
    mt=$(file --brief --mime-type "$0")
    [ -z "${mt#image/jpeg}" ] && printf "$0\n"
' {} \;

答案2

首先,您可以打印带有以下.jpg文件扩展名的文件:

sudo find / -name *.jpg -print

查看其行为方式,进行修改以适应,然后您可以将输出通过管道传输到另一个函数,而不仅仅是打印输出(如果您愿意)。例如,如果您还想允许.JPG

sudo find / -iname "*.jpg"

答案3

这将打印 mime 类型为的所有文件的路径图片/jpeg

find / -type f -exec file --no-pad --mime-type {} + 2>/dev/null \
    | awk '$NF == "image/jpeg" {$NF=""; sub(": $", ""); print}'

有几点需要注意:

  • 使用-exec command {} +-exec command {} \;不是只调用file一次(而不是每个文件调用一次)
  • 使用该--no-pad选项确保file的输出格式一致(以使解析更容易)
  • 用于2>/dev/null抑制 stderr of find,只是必要的,因为运行该命令/会导致大量“权限被拒绝”错误,从而使控制台变得混乱

相关内容