Как перечислять только файлы JPEG из корня ниже с помощью командной строки?

Я ищу метод для поиска только файлов JPEG / С моим ограниченным знанием Linux я пришел к этому:

  1. перечислите все пути, существующие из корня ниже, с помощью find /
  2. перетащите результат в следующую команду и выполните команду file на каждом найденном пути с xargs file
  3. В результате команды file содержится строка JPEG, я подумал, что возможно, каким-то образом IF-оператор будет фильтровать только JPEG-файлы: if (JPEG, содержащиеся в выводе команды файла) {показать аргумент файла}

еще раз:

 find / | xargs file | "If statement" 

Не могли бы вы исправить меня, дать мне подсказку, как выполнить задачу или дать решение?

Если вы хотите перечислить файлы, содержащие изображение в формате JPEG, независимо от расширения в имени файла, вы можете использовать file find + для отображения файлов с типом 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" ' {} \; 

Для начала вы можете распечатать файлы с расширением .jpg с:

 sudo find / -name *.jpg -print 

Посмотрите, как это себя ведет, измените его, и вы можете затем передать вывод в другую функцию, а не просто распечатку, если хотите. Например, если вы хотите разрешить также .JPG :

 sudo find / -iname "*.jpg" 

Это напечатает пути ко всем файлам с типом 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 find , только необходимо, потому что запуск команды из / приведет к многочисленным ошибкам «Разрешения на отказ», которые будут загромождать консоль