如何递归应用命令

How to recursively apply command

我还是 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

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