Как я могу найти все видео файлы в моей системе?
Я попытался использовать поиск файла объектива Unity для *.*
и фильтрация по Last Modified=All, Type=Videos и Size=All, но ничего не нашла, хотя я знаю, что в моей папке Pictures есть файлы.3gp. Я знаю, что у меня есть множество видеофайлов на другом диске, также смонтированном в файловой системе. Я составил список возможных расширений и попробовал множество итераций find
команда, использующая их с find ./ -name "*.ext" -o (и т. д. и т. д., nauseum) без всякой удачи. Каково решение?
4 ответа
Альтернатива: поиск по файлу:
sudo find . -type f -exec file -N -i -- {} + | grep video
или если вы хотите только имена файлов...
sudo find . -type f -exec file -N -i -- {} + | sed -n 's!: video/[^:]*$!!p'
-N, --no-pad
: Не дополняйте имена файлов
-i, --mime
: Заставляет команду file выводить строки типа mime, а не более традиционные для человека. Таким образом, он может сказать "текст / обычный; charset=us-ascii', а не'ASCII text'. Чтобы эта опция работала, файл изменяет способ обработки файлов, распознаваемых самой командой (например, многих типов текстовых файлов, каталогов и т. Д.), И использует альтернативный "магический" файл. (См. Раздел "ФАЙЛЫ" ниже).
Раздел ФАЙЛЫ указывает на:
файлы
/usr/share/misc/magic.mgc
По умолчанию составлен список магии.
/usr/share/misc/magic
Каталог, содержащий магические файлы по умолчанию.
file
хотя и медленный, но откроет все найденные файлы, но имеет то преимущество, что вам не нужно добавлять все эти расширения.
Используя locate:
locate *.mkv *.webm *.flv *.vob *.ogg *.ogv *.drc *gifv *.mng *.avi$ *.mov *.qt *.wmv *.yuv *.rm *.rmvb *.asf *.amv *.mp4$ *.m4v *.mp *.m?v *.svi *.3gp *.flv *.f4v
Я полагаю, что это можно сделать как 1-строчный, но это казалось немного громоздким, поэтому я создал скрипт для простоты запуска и редактирования и назвал его findvids.sh
Это то, что сработало для меня.
Примечание. Возможно, я не охватил ВСЕ типы видеофайлов, но уверен, что большинство из них у меня есть. Одним заметным исключением является.mkv, так как это целевой формат для проекта, и мне не нужно находить файлы, которые уже были обработаны. Должно быть очень просто добавить дополнительные форматы (расширения) в сценарий в соответствии с вашими потребностями, изучив шаблон и изменив его соответствующим образом, сохранив кавычки в начале и конце выражения. Обратите внимание, что файлы, у которых нет разрешения на чтение, не будут найдены.
#!/bin/bash
#This script is intended to find virtually all video file formats.
find /. -type f | grep -E "\.webm$|\.flv$|\.vob$|\.ogg$|\.ogv$|\.drc$|\.gifv$|\.mng$|\.avi$|\.mov$|\.qt$|\.wmv$|\.yuv$|\.rm$|\.rmvb$|/.asf$|\.amv$|\.mp4$|\.m4v$|\.mp*$|\.m?v$|\.svi$|\.3gp$|\.flv$|\.f4v$"
Редактировать на основе комментария: $
в конце расширения означает, что поисковый термин должен быть найден в конце строки. если бы мы хотели соответствовать началу строки, вместо этого мы бы использовали ^
раньше срока мы намерены соответствовать. Вы можете найти эти якоря, объясненные более подробно здесь.
Я сделал сравнение скорости с использованием locate, и результаты были:
time locate *.mkv *.webm *.flv *.vob *.ogg *.ogv *.drc *gifv *.mng *.avi *.mov *.qt *.wmv *.yuv *.rm *.rmvb *.asf *.amv *.mp4$ *.m4v *.mp *.m?v *.svi *.3gp *.flv *.f4v
real 0m8.887s
user 0m5.814s
sys 0m0.052s
против
time find /. -type f | grep -E "\.webm$|\.flv$|\.vob$|\.ogg$|\.ogv$|\.drc$|\.gifv$|\.mng$|\.avi$|\.mov$|\.qt$|\.wmv$|\.yuv$|\.rm$|\.rmvb$|/.asf$|\.amv$|\.mp4$|\.m4v$|\.mp4$|\.m?v$|\.svi$|\.3gp$|\.flv$|\.f4v$"
real 0m2.795s
user 0m0.657s
sys 0m1.115s
Неожиданно найти быстрее. Я буду использовать этот подход.
Изменить: дальнейшее тестирование показывает, что поиск был быстрее на другом компьютере. Я думаю, что мои начальные результаты теста скорости были ложными из-за кеширования.
Источники:
man find
man grep
https://stackoverflow.com/questions/7190565/unix-find-multiple-file-types
В
find
в ответе старшего компьютерщика меня уловила чувствительность к регистру. Мои устройства, похоже, довольно часто использовали заглавные буквы при съемке видео и т. Д. Просто нужно добавить
-i
вариант grep, чтобы исправить это:
find /. -type f | grep -iE "\.webm$|\.flv$|\.vob$|\.ogg$|\.ogv$|\.drc$|\.gifv$|\.mng$|\.avi$|\.mov$|\.qt$|\.wmv$|\.yuv$|\.rm$|\.rmvb$|/.asf$|\.amv$|\.mp4$|\.m4v$|\.mp*$|\.m?v$|\.svi$|\.3gp$|\.flv$|\.f4v$"
Вот надежный и простой ответ, состоящий из
find
,
file
а также
grep
:
find . -type f |
file --mime-type --no-pad --files-from - |
grep --fixed-strings ': image/'
Обратите внимание, что это не будет работать для пути, который содержит
: image/
.