Найдите файлы, соответствующие 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 может быть легко расширено.