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

Microsoft не является ответом. Microsoft является вопросом. НЕТ (или Linux) ответ.

  • взятый отсюда

    Женщина человека $
    Никакая ручная запись для женщины

6
13.09.2010, 00:24
5 ответов

Следующие списки команд строки в 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 снабдите суффиксом, чтобы просто отобразить имена файлов. Это игнорирует строки, которые не соответствуют файлам изображений.
7
27.01.2020, 20:24
  • 1
    я думал об этом, но что, если имя файла содержит 'изображение /'. Это - допустимое имя файла. Лучше возможно for f in files; do file -ib $file | grep '"^image/" && echo $file; done –  Maciej Piechotka 13.09.2010, 01:26
  • 2
    @Maciej стартапов: sed сценарий только соответствует строкам, где текст после последнего двоеточия image/FOO (FOO не позволяется содержать a :). Таким образом, это не проблема, если имена файлов содержат image/. –  Gilles 'SO- stop being evil' 13.09.2010, 02:12
  • 3
    установки find . -type f | xargs -L1 file --mime-type |sed -n 's#: *image/[^ :]*$##p' для получения файлов изображений в dir –  adrianlzt 27.11.2015, 11:55
file -ib image | awk '"^image/" {print}'

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

image/jpeg; charset=binary

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

2
27.01.2020, 20:24
  • 1
    awk является излишеством. Используйте grep вместо этого: | grep 'image'. Кроме того, различные версии file (например, на различных типах Unix), может не возвратить тип MIME, таким образом, image/ является неправильным, и имя файла на первом месте так ^ является также несоответствующим. –  Neil Mayhew 13.09.2010, 00:35
  • 2
    С awk - да, как будто издержки действительно имеют значение по сравнению с запуском нового процесса ;) Можно использовать grep, если Вам нравится. С типа MIME - я использовал -i который просит печатать тип MIME - я предполагаю, что другие возвратят ошибку [я не думаю, что существует легкопереносимый путь]. С имени файла - отмечают -b флаг, который отключает печать файла (Вы не имеете, проверяет команду, которую я отправил, не так ли?). –  Maciej Piechotka 13.09.2010, 00:52
  • 3
    Ой, да, Вы правы. Я забыл использовать-ib, когда я протестировал его. Однако использование-b теряет имя файла, поэтому как Вы знаете, которому соответствовали файлы? –  Neil Mayhew 13.09.2010, 02:09
  • 4
    @Neil: Учитывая, что большинство версий файла не производит ничто похожее для parsable вывода (например, они могли бы распечатать Netboot image или 4 images/screen), что делает Вы предлагаете, чтобы это было лучше, чем установка a file это печатает, может имитировать типы? –  Gilles 'SO- stop being evil' 13.09.2010, 02:17
  • 5
    @Gilles: у Меня действительно нет альтернативного решения. Я просто не знал -i и не удался заметить, что @Maciej использовал его. Я вижу это file поддержки -i на Mac OS так вероятно, это поддерживается на BSDs, также. –  Neil Mayhew 13.09.2010, 03:03

В дополнение к 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 распечатают больше информации (это - GIF с 21 кадром):

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 или подобные инструменты для решения, что сделать с ними.

1
27.01.2020, 20:24

Если у Вас есть Python и волшебство Python. Например,

#!/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)
1
27.01.2020, 20:24

Возможно, существует что-то, что я пропускаю, но это, кажется, работает на меня:

file -i * | grep "image/" | cut -d: -f1
0
27.01.2020, 20:24
  • 1
    Вы пропустили часть, где автор вопроса хочет посмотреть на файлы, имена которых находятся в списке, не файлах в текущем каталоге. –  Gilles 'SO- stop being evil' 03.03.2012, 01:09

Теги

Похожие вопросы