如何对所有子文件夹运行命令

如何对所有子文件夹运行命令

如果您有一系列子文件夹(例如 fromaz)并且想要对每个子文件夹运行命令(例如dsmmigrate * &),您该怎么做?手动方法是,

cd a 
dsmmigrate * &
cd ../b

这似乎太复杂了,所以我相信一定有一种更简单的方法。

答案1

是的,来回更改工作目录很麻烦,而且并不是您真正想要做的事情,因为它可能会导致更复杂的脚本中出现极其奇怪的情况,除非您小心。

更改简单命令的工作目录的常用方法是将cd命令的 和 调用放在子 shell 中。子 shell 的工作目录将发生更改,但更改不会延续到脚本的其余部分,因为子 shell 在其自己的环境中执行。

示例:mycommand在当前工作目录中的所有目录内执行:

for d in *; do
  if [ -d "$d" ]; then         # or:  if test -d "$d"; then
    ( cd "$d" && mycommand )
  fi
done

或者在您的情况下,使用已知的目录ab

for d in a b; do
  ( cd "$d" && dsmmigrate * & )
done

我不了解这个dsmmigrate工具,所以我不能说这样运行它是否正确。

编辑:事实证明,dsmmigrate工具有一个-Recursive标志:

$ dsmmigrate -Recursive /path

答案2

当当前目录为parent_directory:时,您可以执行以下操作:

for d in [a-z]
do
    ( cd $d && your-command-here )
done

(创建)一个子 shell,因此主脚本中的当前目录不会更改。

答案3

这是我在子文件夹中提交多个作业的方式:

for d in */; do ( cd "$d" && yourcommand ) ; done   

相关内容