Как рекурсивно применить команду - PullRequest
0 голосов
/ 06 июля 2018

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

Например. Команда ниже позволяет мне транскрибировать все видеофайлы в той же папке, где находится скрипт bash.

for file in *
do
  autosub -S de -D de "$file" >> results.out
done

Я пытаюсь сделать одну и ту же команду рекурсивно, поэтому мне не нужно делать это каждый раз в каждой папке.

for file in \*
do
  autosub -S de -D de "$file" >> results.out
done

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

То, чего я пытаюсь достичь, это: Запустите команду с autosub -S de -D de $file для каждого файла (с любым расширением. Если его нельзя переписать, он будет пропущен автоматически. Вам не нужно записывать это в сценарии bash, поскольку autosub уже пропускается)

Я хочу переписать все видеофайлы в структуре папок следующим образом:

Folder 1
------SubFolder 2
----------------SubFolder 3\video.avi
Folder 2\video.mp4
Folder 1
--------SubFolder\video.mkv

1 Ответ

0 голосов
/ 06 июля 2018

Обычно для этого можно использовать find:

find . -type f -execdir autosub -S de -D de {} \; >> results.out

Это выполнит вашу команду для каждого файла (уведомление: -type f), расположенного ниже вашего текущего каталога (уведомление .). Команда выполняется каждый раз внутри каталога, в котором находится файл (уведомление: -execdir). Это означает, что ваша команда будет получать имена файлов, такие как ./video.avi, ./video.mp4, а не полный путь относительно вашего исходного каталога. Это считается безопаснее, чем -exec. Все результаты добавляются в один файл , ./results.out.


В качестве альтернативы, , если вы используете bash >= 4.0, вы можете включить globstar с помощью:

shopt -s globstar

, а затем используйте **, который рекурсивно расширяется:

for file in **
do
    autosub -S de -D de "$file" >> results.out
done
...