Как найти файлы изображений по содержанию

У меня есть список файлов, и мне нужно найти все файлы изображений из этого списка.

Например, если в моем списке указано следующее:

pidgin.tar.gz photo01.jpg picture01 screenshot.gif invoice.pdf 

Тогда я бы хотел только выбрать:

 photo01.jpg picture01 screenshot.gif 

Заметки:

  • Метод не должен зависеть от расширений файлов
  • Неясные форматы изображений для Photoshop и Gimp можно игнорировать. (Если feh не может показать это, это не изображение)

  • Как перечислять только файлы JPEG из корня ниже с помощью командной строки?
  • Что может вызвать странное поведение в команде file (1)?
  • Поиск типа файла, предполагающего неправильное расширение
  • Как найти удобочитаемую информацию о типах файлов, распознанных `file`?
  • Определить тип файла с помощью файла magic-file и переименовать файл-суффикс соответственно
  • / usr / bin / статус выхода файла всегда 0
  • Как просмотреть файлы на терминале, чтобы мы могли видеть типы файлов, такие как исполняемый файл, ascii и т. Д.?
  • 5 Solutions collect form web for “Как найти файлы изображений по содержанию”

    Следующая команда перечисляет строки в list_file которые содержат имя файла изображения:

     <list_file xargs -d \\n file -i | sed -n 's!: *image/[^ :]*$!!p' 
    • file -i FOO просматривает первые несколько байтов FOO для определения своего формата и печатает строку, такую ​​как FOO: image/jpeg ( -i означает показать тип MIME, он специфичен для GNU-файла, как это было найдено в Linux).
    • xargs -d \\n считывает список файлов (по одной строке) со стандартного ввода и применяет к нему последующую команду. (Для этого требуются GNU xargs, найденные в Linux, а в других системах оставьте -d \\n , но тогда список файлов не может содержать \'" или пробел).
    • Команда sed отфильтровывает суффикс : image/FOO чтобы просто отображать имена файлов. Он игнорирует строки, которые не соответствуют файлам изображений.
     file -ib image | awk '"^image/" {print}' 

    Если файл обнаруживает изображение, он должен печатать строку следующим образом:

     image/jpeg; charset=binary 

    Он работает на магические числа, поэтому он не основан на расширениях. Это

    В дополнение к команде file вы также можете использовать ImageMagick. Ниже будет показан тип всех файлов в текущем каталоге:

     find -type f -depth 0 -print0 | xargs -0 identify 

    Команда identify выведет что-то вроде этого для разных типов файлов:

     text.txt[8] TXT 612x792 612x792+0+0 16-bit DirectClass 694B 0.320u 0:00.330 php.jpg[31] JPEG 1280x1024 1280x1024+0+0 8-bit DirectClass 195KB 0.000u 0:00.000 

    Анимированные GIF-файлы будут печатать больше информации (это 21-кадровый GIF):

     adhd.gif[0] GIF 211x200 211x200+0+0 8-bit PseudoClass 256c 233KB 0.000u 0:00.029 adhd.gif[1] GIF 168x130 211x200+22+22 8-bit PseudoClass 256c 233KB 0.000u 0:00.029 adhd.gif[2] GIF 168x130 211x200+22+22 8-bit PseudoClass 256c 233KB 0.000u 0:00.029 ... adhd.gif[18] GIF 168x130 211x200+22+22 8-bit PseudoClass 256c 233KB 0.000u 0:00.000 adhd.gif[19] GIF 168x130 211x200+22+22 8-bit PseudoClass 256c 233KB 0.000u 0:00.000 adhd.gif[20] GIF 168x130 211x200+22+22 8-bit PseudoClass 256c 233KB 0.000u 0:00.000 

    Затем вы можете использовать awk или аналогичные инструменты, чтобы решить, что с ними делать.

    Если у вас есть Python и python-magic . Например

     #!/usr/bin/env python import magic import os path=sys.argv[1] mime = magic.open(magic.MAGIC_NONE) mime.load() for r,d,f in os.walk(path): for files in f: filename=os.path.join(r,files) filetype=mime.file(filename) if "image" in filetype: print "File: %s is %s" %(filename, filetype) 

    Возможно, что-то мне не хватает, но, похоже, это работает для меня:

     file -i * | grep "image/" | cut -d: -f1 
    Linux и Unix - лучшая ОС в мире.