【问题标题】:How to recursively apply command如何递归应用命令
【发布时间】:2018-12-14 13:19:22
【问题描述】:

我还是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 脚本位于同一文件夹中时,它才会将该命令应用于文件。

我想要实现的是: 为每个文件(任何扩展名。如果无法转录,它将自动跳过。您不必在 bash 脚本中编写该命令,因为 autosub 已经跳过)

我想在这样的文件夹结构中转录所有视频文件:

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

【问题讨论】:

  • 感谢 jkdev 先生纠正我的写作:) 我不擅长英语。
  • 嘿,@G.L,下面的答案好运吗?
  • 嗨。它完美无缺。我现在什至将它与 Cron 一起使用。 /o/
  • 这是个好消息,我很高兴它对你有用!由于您是 StackOverflow 的新手(欢迎!),请注意您可以accept 回答对您有帮助的答案。这将关闭问题并在搜索答案时帮助有类似问题的用户。
  • 由于浏览器插件,“接受”按钮对我不起作用。

标签: bash video directory subdirectory


【解决方案1】:

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

【讨论】:

  • 我会稍微重新排列 find 命令 - 将 >> results.out 放在 \; 之前似乎意味着它是将在文件目录中执行的命令的一部分,但它是实际上在find 甚至开始之前由shell 解析和应用。把它放在命令的末尾会更清楚。
  • @GordonDavisson,我完全同意。感谢您指出这一点。
猜你喜欢
  • 1970-01-01
  • 2015-09-27
  • 2021-09-17
  • 2010-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多