如何在多个目录上执行bash脚本?

如何在多个目录上执行bash脚本?

我有一个conv.sh脚本可以循环当前目录中的 MP3 文件并将它们转换为 OGG。我还有几个目录 {F1, F2,..., F20} 位于/path/to/Files/.我应该如何conv.sh在所有这些目录上执行?

答案1

尝试这个

curdir=$(pwd)
for folder in /path/to/Files/*; do 
  [ -d "$folder" ] && cd "$folder" && ./conv.sh
done
cd $curdir

或者假设你在/path/to/Files/,这也有效

for f in *; do [ -d "$f" ] && cd "$f" && ./conv.sh; done; cd ..

您可以使用F{1..20}代替来*获得更高的精度。

答案2

尝试这样做:

./conv.sh /path/to/Files/F[0-9]*/*.mp3

此命令仅处理目录中以F和数字开头的 mp3球体

答案3

您可以使用 xargs 或 GNU 并行:

echo /path/to/Files/F{1..20} | tr ' ' '\n' |
  xargs -L conv.sh

或者:

echo /path/to/Files/F{1..20} | tr ' ' '\n' |
  parallel conv.sh

编辑 - 明智地处理空间

正如 Ole 所指出的,上述方法都不能正确处理空间,即dir name会被视为两个单独的参数,如果目录名称包含换行符,则会出现相同的问题。

处理这些问题的最佳方法是使用 null 作为分隔符,例如使用 GNU find:

find /path/to/Files -mindepth 1 -maxdepth 1 -type d -regex '.*/F[0-9]*' -print0 |
  parallel -0 conv.sh

相关内容