编写脚本以将两个文件从每个目录复制到它们各自的目录

时间:2019-07-01 21:22:28

标签: bash shell

我在“ 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

2 个答案:

答案 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的方法似乎更简洁,但是我想提供一种替代方法:)这也应该可行。