如何递归应用命令

时间:2018-07-06 01:08:44

标签: bash video directory subdirectory

我仍然是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 :(得分:4)

通常,人们会为此使用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