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

Sup*_*ing 5 shell wildcards files

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

cd a 
dsmmigrate * &
cd ../b
Run Code Online (Sandbox Code Playgroud)

这看起来太复杂了,所以我相信一定有更简单的方法。

Kus*_*nda 5

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

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

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

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

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

for d in a b; do
  ( cd "$d" && dsmmigrate * & )
done
Run Code Online (Sandbox Code Playgroud)

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

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

$ dsmmigrate -Recursive /path
Run Code Online (Sandbox Code Playgroud)


Rah*_*hul 3

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

for d in [a-z]
do
    ( cd $d && your-command-here )
done
Run Code Online (Sandbox Code Playgroud)

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