如果您有一系列子文件夹(例如 froma
到z
)并且想要对每个子文件夹运行命令(例如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
或者在您的情况下,使用已知的目录a
和b
:
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