如何递归应用命令
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
我还是 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