我有多个目录和子目录,例如 C201201A/RA/、C201202A/RB 等。所以我想将 setphase.sh 复制到所有子目录中并运行它。我已经尝试过下面的代码
#!/bin/bash
ls -d */*/ > folders.txt
no=1
while read folder
do echo $folder
cp setphase.sh $folder
sh setphase.sh
no=`expr $no + 1`
done < folders.txt
我必须在哪里写sh setphase.sh
?
答案1
如果脚本实际上不需要位于目录中(很少有脚本...而那些确实需要的脚本几乎肯定写得不好并且需要修复),您可以使用 的find
选项-execdir
仅在每个目录中运行脚本。例如:
find . -mindepth 2 -maxdepth 2 -type d -execdir /path/to/setphase.sh \;
来自 GNUfind
手册页:
-execdir command ;
-execdir command {} +
与 类似
-exec
,但指定的命令是从包含匹配文件的子目录运行的,该子目录通常不是您启动的目录find
。这是一种更安全的调用命令的方法,因为它避免了解析匹配文件的路径期间的竞争条件。
与
-exec
操作一样,+
的形式-execdir
将构建一个命令行来处理多个匹配的文件,但任何给定的命令调用都只会列出同一子目录中存在的文件。如果你使用这个选项,你必须确保你的
$PATH
环境变量没有引用.
;否则,攻击者可以通过在您将运行的目录中保留适当命名的文件来运行他们喜欢的任何命令-execdir
。这同样适用于 $PATH 中的条目为空或不是绝对目录名称。如果任何调用返回非零值作为退出状态,则
find
返回非零退出状态。如果find
遇到错误,有时会导致立即退出,因此某些挂起的命令可能根本无法运行。操作的结果取决于是否正在使用该操作
+
或变体;始终返回 true,而仅当命令返回 0 时才返回 true。;
-execdir command {} +
-execdir command {} ;
答案2
如果所有子目录都在C2012A/
目录下,您可以将cp
脚本复制到子目录中,然后使用for
如下结构运行它:
for d in C2012A/*/; do
cp setphase.sh "$d"
sh "$d"/setphase.sh
done
假设脚本不依赖于其运行位置。
另请注意,通过执行sh setphase.sh
,您明确提到将脚本作为参数运行sh
(可能是dash
,bash
或其他取决于您的系统),而不管 shebang 是什么,如果您在脚本。
如果子目录位于不同目录下:
for d in C2012A/*/ A1812A/*/ B8012B/*/; do
cp setphase.sh "$d"
sh "$d"/setphase.sh
done
替换目录名称以满足您的要求。