Как конвертировать все видеофайлы во вложенные папки? (пакетное преобразование)

whereis(1) не подходит для вашей цели, поскольку это не инструмент поиска имени пути по умолчанию.

Без индекса поиска

Как отметил Гилл в своем ответе, вы можете используйте whereis(1) для этого задания, но я хочу сделать небольшое, но значительное улучшение1:

find [PATH...] -depth -path '*gmai*' -print # -delete

Объяснение:

find [PATH...] проходит через все файлы и подкаталоги под каждым PATH или текущими рабочими каталогами, если путь не указан, и печатает все совпадения (по умолчанию). -path PATTERN соответствует полному пути к PATTERN, используя globbing if any, поэтому *gmai* соответствует всем именам путей с инфикс gmai. -delete удаляет все согласованные пути (и переопределяет действие по умолчанию для их печати). -depth указывает find на соответствие детям перед родителями, т.е. е. записи каталога перед самими родительскими каталогами. Необходимо удалить детей перед родителями, потому что в семантике файловой системы Unix можно удалить только пустые каталоги. -print печатает все согласованные пути. Используйте это, чтобы проверить результат перед фактическим удалением. Комментарий в команде -delete (удалив # перед ним), чтобы фактически удалить их.

Без индекс поиска

Если все поисковые места, которые вы собираетесь удалить, появятся в индексе поиска mlocate.db(5), вы можете использовать его для более быстрого поиска:

locate '/your/parent/path/*gmai*'

выполняет поиск всех (индексированных) путей, начинающихся с /your/parent/path/, и имеет инфикс gmai в своем остатке.

Для удаления результатов используйте:

locate -0 '/your/parent/path/*gmai*' | xargs -r -0 -- rm -rf --

Объяснение:

find [PATH...] проходит через все файлы и поддиректории под каждым PATH или текущими рабочими каталогами, если путь не указан, и печатает все совпадения (по умолчанию).

find [PATH...] просматривает все файлы и подкаталоги под каждым PATH или текущие рабочие каталоги, если путь не указан, и распечатывает все совпадения (по умолчанию).

-path PATTERN соответствует полным путям против PATTERN, используя globbing, если таковые имеются, поэтому *gmai* соответствует всем именам путей с помощью инфикс gmai.

-path PATTERN соответствует полным путям против PATTERN, используя globbing if any, поэтому *gmai* соответствует всем именам путей с инфикс gmai.

-delete удаляет все согласованные пути (и переопределяет действие по умолчанию для их печати).

xargs собирает «элементы» со своего ввода, добавляет их в заданная команда и запускает эту команду.

3
задан 3 March 2018 в 19:42

3 ответа

Вы можете использовать ffmpeg для преобразования видеоформатов. Если он еще не установлен, используйте его:

sudo apt install ffmpeg

Я успешно попробовал следующую команду для преобразования образца видео в формат DivX 5.0 на основе AVI:

ffmpeg -i sample.mp4 -f avi -vtag DX50 sample.divx
2] Сначала вы указываете входной видеофайл, например, -i Videos/sample.mts, то мы говорим, что хотим, чтобы выходной формат был AVI с тегом DivX 5.0, используя -f avi -vtag: DX50. Последний аргумент - это выходной файл для генерации, здесь Videos/sample.divx.

Сначала я попробую с одним маленьким видео и убедитесь, что все работает так, как ожидалось, и оба формата распознаются вашим игроком так как качество видео и размер файла в порядке. Вы можете настроить последнюю с дополнительным аргументом -q:v N, где N - это число, а более низкие значения - более высокое качество и размер файла. Хорошие значения, вероятно, находятся в диапазоне 2-8, возможно, попробуйте 5:

ffmpeg -i sample.mp4 -f avi -vtag DX50 -q:v 5 sample.divx

Затем, как только тест прошел успешно, и формат и качество в порядке, вы можете пакетно конвертировать все ваши видеофайлы .mts внутри определенного исходного каталога с рекурсивно с помощью сценария Bash:

#!/bin/bash

# Change the directories and quality level (lower=better) below accordingly:
inputfolder="/path/to/somewhere"
outputfolder="/path/to/elsewhere"
videoquality=5

shopt -s globstar nocaseglob nocasematch  # enable ** and globs case-insensitivity

for inputfile in "$inputfolder"/**/*.mts ; do
    outputfile="$outputfolder/$(basename "${inputfile%.mts}").divx"
    ffmpeg -i "$inputfile" -f avi -vtag DX50 -q:v "$videoquality" "$outputfile"
done

Или, если вы хотите, чтобы выходные файлы в том же каталоге, что и вход, вот более короткая версия:

#!/bin/bash

# Change the directory and quality level (lower=better) below accordingly:
folder="/path/to/somewhere"
videoquality=5

shopt -s globstar nocaseglob nocasematch  # enable ** and globs case-insensitivity

for inputfile in "$folder"/**/*.mts ; do
    ffmpeg -i "$inputfile" -f avi -vtag DX50 -q:v "$videoquality" "${inputfile%.mts}.divx"
done
2
ответ дан 22 May 2018 в 12:47
  • 1
    Спасибо за Ваш ответ. Я пробовал скрипт bash, но он не работает рекурсивно внутри дочерних папок. (моя структура папок выглядит так: parent: / 2017 child: / 2017/2017 \ 03 / birthday / (да, к сожалению, у меня есть пробелы внутри имен папок) – Tolga 4 March 2018 в 09:11
  • 2
    Видеопроигрыватель VLC может конвертировать несколько видео. Я не знаю, делает ли он то, что вы просите, но, по крайней мере, с помощью указателя мыши и клавиши shift вы можете добавить сразу несколько видеороликов в список конверсий. – user186255 4 March 2018 в 14:47
  • 3
    @Tolga Можете ли вы объяснить, что именно не сработало? Любые ошибки? Любые файлы пропущены? Я не думаю, что пространство должно быть проблемой ... Или вы получили его, чтобы работать позже, когда вы приняли ответ? – Byte Commander 4 March 2018 в 16:26
  • 4
    У меня все еще есть проблема. Проблема заключается в том, что выходной файл не помещается в ту же папку исходного файла. Ниже приведен пример входного файла и выходного файла = & gt; i: / home / Public / Shared Pictures / 2016/2016 11 / MVI_6260.MTS o: / home / Public / Shared Pictures / 2016 / MVI_6260.divx – Tolga 4 March 2018 в 17:01
  • 5
    О, ты хочешь, чтобы они всегда были в одной папке? Это немного упростит скрипт, позвольте мне добавить еще одну версию. Может быть, тогда тебе лучше работать ... – Byte Commander 4 March 2018 в 17:09

Вы можете использовать ffmpeg для преобразования видеоформатов. Если он еще не установлен, используйте его:

sudo apt install ffmpeg

Я успешно попробовал следующую команду для преобразования образца видео в формат DivX 5.0 на основе AVI:

ffmpeg -i sample.mp4 -f avi -vtag DX50 sample.divx

Сначала вы указываете входной видеофайл, например, -i Videos/sample.mts, то мы говорим, что хотим, чтобы выходной формат был AVI с тегом DivX 5.0, используя -f avi -vtag: DX50. Последний аргумент - это выходной файл для генерации, здесь Videos/sample.divx.

Сначала я попробую с одним маленьким видео и убедитесь, что все работает так, как ожидалось, и оба формата распознаются вашим игроком так как качество видео и размер файла в порядке. Вы можете настроить последнюю с дополнительным аргументом -q:v N, где N - это число, а более низкие значения - более высокое качество и размер файла. Хорошие значения, вероятно, находятся в диапазоне 2-8, возможно, попробуйте 5:

ffmpeg -i sample.mp4 -f avi -vtag DX50 -q:v 5 sample.divx

Затем, как только тест прошел успешно, и формат и качество в порядке, вы можете пакетно конвертировать все ваши видеофайлы .mts внутри определенного исходного каталога с рекурсивно с помощью сценария Bash:

#!/bin/bash # Change the directories and quality level (lower=better) below accordingly: inputfolder="/path/to/somewhere" outputfolder="/path/to/elsewhere" videoquality=5 shopt -s globstar nocaseglob nocasematch # enable ** and globs case-insensitivity for inputfile in "$inputfolder"/**/*.mts ; do outputfile="$outputfolder/$(basename "${inputfile%.mts}").divx" ffmpeg -i "$inputfile" -f avi -vtag DX50 -q:v "$videoquality" "$outputfile" done

Или, если вы хотите, чтобы выходные файлы в том же каталоге, что и вход, вот более короткая версия:

#!/bin/bash # Change the directory and quality level (lower=better) below accordingly: folder="/path/to/somewhere" videoquality=5 shopt -s globstar nocaseglob nocasematch # enable ** and globs case-insensitivity for inputfile in "$folder"/**/*.mts ; do ffmpeg -i "$inputfile" -f avi -vtag DX50 -q:v "$videoquality" "${inputfile%.mts}.divx" done
2
ответ дан 17 July 2018 в 19:38

Вы можете использовать ffmpeg для преобразования видеоформатов. Если он еще не установлен, используйте его:

sudo apt install ffmpeg

Я успешно попробовал следующую команду для преобразования образца видео в формат DivX 5.0 на основе AVI:

ffmpeg -i sample.mp4 -f avi -vtag DX50 sample.divx

Сначала вы указываете входной видеофайл, например, -i Videos/sample.mts, то мы говорим, что хотим, чтобы выходной формат был AVI с тегом DivX 5.0, используя -f avi -vtag: DX50. Последний аргумент - это выходной файл для генерации, здесь Videos/sample.divx.

Сначала я попробую с одним маленьким видео и убедитесь, что все работает так, как ожидалось, и оба формата распознаются вашим игроком так как качество видео и размер файла в порядке. Вы можете настроить последнюю с дополнительным аргументом -q:v N, где N - это число, а более низкие значения - более высокое качество и размер файла. Хорошие значения, вероятно, находятся в диапазоне 2-8, возможно, попробуйте 5:

ffmpeg -i sample.mp4 -f avi -vtag DX50 -q:v 5 sample.divx

Затем, как только тест прошел успешно, и формат и качество в порядке, вы можете пакетно конвертировать все ваши видеофайлы .mts внутри определенного исходного каталога с рекурсивно с помощью сценария Bash:

#!/bin/bash # Change the directories and quality level (lower=better) below accordingly: inputfolder="/path/to/somewhere" outputfolder="/path/to/elsewhere" videoquality=5 shopt -s globstar nocaseglob nocasematch # enable ** and globs case-insensitivity for inputfile in "$inputfolder"/**/*.mts ; do outputfile="$outputfolder/$(basename "${inputfile%.mts}").divx" ffmpeg -i "$inputfile" -f avi -vtag DX50 -q:v "$videoquality" "$outputfile" done

Или, если вы хотите, чтобы выходные файлы в том же каталоге, что и вход, вот более короткая версия:

#!/bin/bash # Change the directory and quality level (lower=better) below accordingly: folder="/path/to/somewhere" videoquality=5 shopt -s globstar nocaseglob nocasematch # enable ** and globs case-insensitivity for inputfile in "$folder"/**/*.mts ; do ffmpeg -i "$inputfile" -f avi -vtag DX50 -q:v "$videoquality" "${inputfile%.mts}.divx" done
2
ответ дан 23 July 2018 в 20:22

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

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