Найдите файлы, соответствующие mimetype в каталоге, рекурсивно через командную строку

Я хочу получить список всех файлов в папке проекта [рекурсивно], которые являются файлами изображений. К сожалению, Google не смог мне здесь помочь.

Если возможно, предпочтительнее использовать MIME-типы текущей системы, например, все файлы, которые имеют MIME, совпадающие с глобом. image/*; так что любой пример может быть легко расширен для video/*, так далее.

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


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


Редактировать: @KasiyA указал на поток, иллюстрирующий поиск файлов по расширению, что я считаю довольно тривиальным и не совсем то, что я ищу; Я отредактировал заголовок, чтобы отразить, что я специально искал результаты на основе mimetype.

3 ответа

Предполагая, что вы на 14.04 (используете python3), небольшой скрипт ниже рекурсивно перечисляет ваши файлы в заданном каталоге. Он идентифицирует mimetype файла с помощью file команда, как описано здесь

file --mime-type -b filename

Кроме того, вы можете расширить скрипт, добавив команду с помощью shutil (например .move / .copy) на том же уровне, что и print команда.

Добавление миметипов

Для комбинированного поиска вы можете добавить (или удалить) mimetypes для поиска, добавив их в filetypes -кратный.

Сценарий

#!/usr/bin/env python3

import os
import subprocess

source_dir = "/path/to/directory"
filetypes = ("image", "video")

for root, dirs, files in os.walk(source_dir):
    for name in files:
        file = root+"/"+name
        ftype = subprocess.check_output(['file', '--mime-type', '-b', file]).decode('utf-8').strip()
        if ftype.split("/")[0] in filetypes:
            print(file)

Как это использовать

Скопируйте скрипт в пустой файл, установите каталог в список (sourcedir) и mimtype (s) для поиска (filetypes), сохраните как list_files.py и запустите его командой:

python3 /path/to/list_files.py

Я не очень хорошо разбираюсь в сценариях, но все же могу найти рекурсивно все файлы и отобразить их с типом изображения, используя mimetype файлов.

 find . -print0 | while IFS= read -r -d'' f; do 
    file -ib $f | grep "^image/" && echo $f; 
 done

Это может быть близко:

find . -type f -exec mimetype {} + | awk -F': +' '{ if ($2 ~ /^image\//) print $1 }'

Регулярное выражение в выражении awk может быть легко расширено.

Другие вопросы по тегам