我在“ mini”文件夹下有19个目录(0,n10,n20,n30,... n180)。我需要将每个目录中的两个文件(0_mini_vh1.coor和0_mini_vh1.xsc,n10_mini_vh1.coor和n10_mini_vh1.xsc等)复制到文件夹下相同名称(0,n10,n20等)的相应目录中。 “生产”。到目前为止,我已经为脚本编写了这篇文章,但是它似乎没有用。我应该如何改善脚本?
#!/usr/bin/env bash
for f in n10 n100 n110 n120 n130 n140 n150 n160 n170 n180 n20 n30 n40 n50 n60 n70 n80 n90
do
cd $f
echo "cp $f_mini_vh1.coor ../../production/$f"
echo "cp $f_mini_vh1.xsc ../../production/$f"
cd ../
done
答案 0 :(得分:1)
for f in n{10..180..10}; do (
cd "$f"
echo cp "$f"_mini_vh1.{coor,xsc} ../../production/"$f"
) done
您可以使用花括号将其扩展为所有所需的名称:{start..stop..incr}
。您可以使用相同的技巧将两个文件名与{coor,xsc}
组合在一起。
请谨慎写$f_mini_vh1
。这是一个名为f_mini_vh1
的变量。要将f
与其余部分分开,您需要编写${f}_mini_vh1
或"$f"_mini_vh1
。我建议后者遵循一般性指导,即始终引用变量展开。
带括号的子外壳将使您不必每次都要cd ../
。每当我在脚本中使用cd
来限制目录更改的范围时,我都喜欢使用子外壳。
您还可以通过将cd
添加到$f
命令中来完全跳过cp
:
for f in n{10..180..10}; do
echo cp "$f"/"$f"_mini_vh1.{coor,xsc} ../production/"$f"
done
答案 1 :(得分:0)
这也可以通过数组和while循环来完成!
这是我要这样做的方式:
arr=(0 n10 n100 n110 n120 n130 n140 n150 n160 n170 n180 n20 n30 n40 n50 n60 n70 n80 n90)
cnt=0
while [ $cnt -lt ${#arr[@]} ]; do
f=${arr[$cnt]}
cp ./$f/${f}_mini_vh1.xsc ../production/$f
cp ./$f/${f}_mini_vh1.coor ../production/$f
let cnt=cnt+1
done
但是我还是一个相对较新的人,总是在学习,John的方法似乎更简洁,但是我想提供一种替代方法:)这也应该可行。