我有一个非常简单的脚本。我只想在各个目录中进行 cd 操作,如下所示:
cd PKA1/timestep_size/v_0.001/250eV
../ovitos silica_defects.py
我想以 1 为增量循环 PKA1 到 PKA24。我该怎么做?另外,有没有办法将silica_defects.py应用于每个目录并让它在其中输出文件,而不是将silica_defects.py复制到每个子文件夹(250eV子文件夹)。
答案1
bash
这是's 大括号扩展的工作, {START..END}
:
PKA{1..24}
所以你可以这样做:
for f in PKA{1..24}/timestep_size/v_0.001/250eV/; do ...; done
对于silica_defects.py
,使用文件的绝对路径。
答案2
让我们使用 for 循环生成整数 1 到 24,cd
在子 shell 中使用将目录更改为子目录,然后执行脚本:
for (( i = 1; i <= 24; ++i )); do
( cd "PKA$i/timestep_size/v_0.001/250eV" && ../ovitos /path/to/silica_defects.py )
done
cd
通过使用子 shell,您可以避免在使用下一个子目录之前必须“更改回”旧目录。使用&&
,您还可以避免在目录由于某种原因不存在时尝试运行该程序。
显然,你也可以这样做
for i in {1..24}; do
( cd "PKA$i/timestep_size/v_0.001/250eV" && ../ovitos /path/to/silica_defects.py )
done
...但出于美观原因,我不喜欢这种{start..end}
语法,而且它也没有让您有机会更灵活地执行循环(在其他情况下)。
答案3
有什么问题:
for ((i=1;i<=24;i++)) ; do
cd PKA${i}/timestep_size/v_0.001/250eV
../ovitos silica_defects.py
cd $OLDPWD
done