Как искать видеофайлы в Ubuntu?

12

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

Загруженный мной видеофайл может иметь любое расширение (например, webm и т. Д.), А также возможно, что в то время я изменил название на что-то вроде abcde, которое я сейчас не помню. Таким образом, поиск не может быть основан на имени файла!

(Просто упомяну одно сходство: в Perl есть команды для проверки, является ли файл текстовым или двоичным, и т. Д. Аналогичным образом может быть способ проверить, является ли его видеофайл или мультимедийный файл)

Ravi
источник

Ответы:

14

Основная идея заключается в использовании файловой утилиты для определения типа каждого файла и фильтрации видеофайлов.

find /some/directory -type f -exec file -N -i -- {} + |
sed -n 's!: video/[^:]*$!!p'

Это печатает имена всех файлов /some/directoryи их подкаталогов рекурсивно, чей тип MIME является типом видео.

fileКоманда должна открыть каждый файл, который может быть медленным. Чтобы ускорить процесс:

  • Ограничьте команду деревьями каталогов, где она может быть, например /tmp, /var/tmpи вашим домашним каталогом.
  • Ограничьте поиск файлами, размер которых находится в правой области, скажем, не менее 10 МБ.
  • Ограничьте поиск файлами, время модификации которых находится в нужном месте. Обратите внимание, что при загрузке файла может быть установлено время его изменения на время загрузки или сохранено время, в зависимости от того, какую программу вы использовали для загрузки (и с какими настройками). Вы также можете фильтровать время изменения inode (ctime), то есть время, когда файл был последний раз изменен или перемещен (создан, переименован и т. Д.) Любым способом.

Вот пример, который ограничивает время модификации как минимум 60 дней назад, а время ctime - не более 100 дней назад.

find /tmp /var/tmp ~ -type f -size +10M \
     -mtime +60 -ctime -100 \
     -exec file -N -i -- {} + |
sed -n 's!: video/[^:]*$!!p'
Жиль "ТАК - перестань быть злым"
источник
Ваша первая команда выбирает много других (кроме видео) файлов. Например, одна строка вывода выглядит так: /home/ravbholua/Downloads/Music_Command_line/[SOLVED] a code question regarding music file extensions_files/avatar774785_6.gif: image/jpeg; charset=binary Другая строка вывода: /home/ravbholua/Free Computer Networking Books Download | Ebooks Online Textbooks.html: text/html; charset=iso-8859-1 мне нужны только видеофайлы, которые будут работать в vlc player и т. Д.
Ravi
@Ravi Я случайно пропустил возможность sedисключать несовпадающие строки (а также возможность fileне прерывать строки в неправильном месте), см. Мое редактирование.
Жиль "ТАК - перестань быть злым"
Да, Жиль, это то, что я хотел. Это сработало великолепно! После запуска вашей команды я узнал, что в моей системе есть много видео (некоторые полные, а некоторые неполные), о которых я не знал. Спасибо.
Рави
1
Это идеальное решение, если ваши видеофайлы не имеют предсказуемых расширений. Прибегать к fileявляется единственным вариантом.
Miguelg
13

Поиск по имени файла

Как отметил Крис в своем ответе, вы можете использовать findэто, но я считаю, что поиск по locateбазе данных гораздо быстрее .

Предполагая, что ваш дистрибутив предоставляет эту возможность, большинство крупных компаний, Ubuntu, Fedora, CentOS и т. Д., Делают это.

пример

$ locate --basename .mp4 .mkv .wmv .flv .webm .mov .avi | head -5
/home/saml/Desktop/sample_mpeg4.mp4
/home/saml/Downloads/Karrolls_Christmas/Karroll's Christmas (2004) part 1.mp4
/home/saml/Downloads/Karrolls_Christmas/Karroll's Christmas (2004) part 10.mp4
/home/saml/Downloads/Karrolls_Christmas/Karroll's Christmas (2004) part 2.mp4
/home/saml/Downloads/Karrolls_Christmas/Karroll's Christmas (2004) part 3.mp4

Поиск по типу файла

Чтобы найти файлы по типу, вы можете использовать команду, fileчтобы получить список информации о конкретном типе файла.

Вот приблизительный список этих типов файлов из моей системы, Fedora 19.

  • .mp4: ISO Media, система MPEG v4, версия 1
  • .mkv: файл EBML, создатель matroska
  • .wmv: Microsoft ASF
  • .flv: Macromedia Flash Video
  • .webm: WebM
  • .mov: ISO Media, фильм Apple QuickTime
  • .avi: AVI

Вы можете использовать эту команду, чтобы найти все файлы в вашем /home/<user>каталоге.

$ find /home/<user> -type f -exec file {} + | \
    grep -E "MPEG v4|EBML|\
      Microsoft ASF|Macromedia Flash Video|WebM|Apple QuickTime movie|AVI"

Кроме того, вы можете использовать fileи искать по MIME-типы, которые относятся к категории "видео".

 -i, --mime
         Causes the file command to output mime type strings rather than 
         the more traditional human readable ones.  Thus it may say 
         ‘text/plain; charset=us-ascii’ rather than “ASCII text”.

Адаптируем то, что мы сделали выше, к чему-то вроде этого:

$ find /home/<user> -type f -exec file -i {} + | grep video

Вы можете использовать, sedчтобы получить только имена файлов:

$ find /home/<user> -type f -exec file -i {} + |
    sed -n '/video/s/:[^:]\+$//p'
SLM
источник
+1, это также, конечно, не только предполагает, что locateустановлено, но что база данных построена.
Крис Даун
Да, в большинстве дистрибутивов база данных обычно создается по ночам, поэтому недавно добавленные файлы не будут в БД до тех пор, пока не будет запущена ночная работа и их не добавят.
SLM
1
Вы забыли один из самых распространенных avi.
Фахим Митха
6

Поскольку теперь вы указываете, что он не может быть основан на расширении, вы также можете просмотреть file(предупреждение: это может занять много времени):

find ~ -type f -exec file -i {} + | grep video 

Если бы вы могли искать по имени файла, предполагая, что оно имеет общее расширение видео и находится где-то в вашем домашнем каталоге:

find ~ -type f -name '*.mkv' -o -name '*.mp4' -o -name '*.wmv' -o -name '*.flv' -o -name '*.webm' -o -name '*.mov'

Вы также можете использовать регулярное выражение:

find ~ -type f -regex '.*\.\(mkv\|mp4\|wmv\|flv\|webm\|mov\)'

Если у вас есть хорошее представление о том, когда вы загрузили его (и предполагая, что mtime был установлен на это время), вы также можете попробовать сузить его с помощью -mtimeопции GNU find .

Крис Даун
источник
1
Вы также можете показать все файлы, размер которых превышает некоторый порог (при условии, что видеофайлы очень большие) ...
ChuckCottrill
Крис Даун, такой способ использования имени файла не сработает. Я отредактировал свою Q. пожалуйста, посмотрите
Ravi
@Ravi Смотрите мой обновленный ответ, который использует mimetypes.
Крис Даун
Ваша первая команда извлекает даже много других (кроме видео) файлов. Например, одна строка из выходных данных: /home/ravbholua/Downloads/Music_Command_line/Any s_w to cut_add audio files, convert video to audio?_files/post_old.gif: image/gif; charset=binary Другая строка из выходных данных: /home/ravbholua/Downloads/Music_Command_line/command line - how to start a video from the terminal? - Ask Ubuntu.html: text/html; charset=utf-8 Это не решает мою цель.
Рави