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

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

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

  • Как grep аргумент командной строки, на который был применен RegEx?
  • Как включить заполнение bash в режиме vi на Synology DSM6
  • Создание содержимого сложной переменной вручную
  • Как согласовать файл и строку на лету?
  • ошибка при выполнении команды find с использованием переменной
  • unix для печати до 3-го появления «/» в каждой строке
  • pidgin.tar.gz photo01.jpg picture01 screenshot.gif invoice.pdf 

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

     photo01.jpg picture01 screenshot.gif 

    Заметки:

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

  • echo показывает 1 4 5 6 ... почему?
  • CentOS | больше не отображается?
  • Получите имя файла, из которого записывается запись
  • Почему восклицательный знак `!` Иногда расстраивает bash?
  • Как я могу увидеть, какая команда была фактически запущена в оболочке, через псевдоним или функцию
  • Режим оболочки Emacs делает $ PS1 разным
  • 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 - лучшая ОС в мире.