写这个Bash脚本的更好方法是什么?

时间:2011-02-26 08:56:15

标签: bash

此解决方案(如下所列)有效,但它看起来不是最实用的解决方案。我想要做的是填充一个名为t _ ### _ u的子文件夹,然后用两个文件填充这些子目录(其中一个应该重命名为父目录名并附加.c)任何人都可以发布一个更好,更优雅的解决方案?

for i in {1..100}
do
    mkdir `printf "t_%03d_u" $i`;
    cp ./templates/* `printf "t_%03d_u" $i`;
    mv `printf "./t_%03d_u/template.c" $i` `printf "./t_%03d_u/t_%03d.c" $i $i`;
done

echo "Did it work?"

感谢您提前提供任何帮助。

6 个答案:

答案 0 :(得分:2)

改进脚本最明显的方法是为您使用的名称指定一个变量:

name=`printf "t_%03d" $i`

所以你可以做到

mkdir ${name}_u
cp ./templates/* ${name}_u/
mv ./${name}_u/template.c ./${name}_u/$name.c

答案 1 :(得分:1)

Bash 4。

for num in {001..100}
do        
    path="t_${num}_u"
    mkdir "$path"
    cp ./templates/* "$path";
    mv $path/template.c  ./$path/t_${num}.c
done

答案 2 :(得分:1)

seq -w非常有用:)

#!/bin/bash

for i in `seq -w 1 100`
do
    mkdir t_${i}_u
    cp ./templates/* t_${i}_u
    mv ./t_${i}_u/template.c ./t_${i}_u/t_${i}_u.c
done

echo "Did it work?"

我确信通过计算一次目录的名称并重新使用它可以进一步改进,但这更好,我可以在这里停下来。 :)

答案 3 :(得分:0)

我唯一的建议是将零填充字符串设置为变量以便于阅读:

for i in {1..100}
do
  s=$(printf "%03d" $i)
  mkdir t_${s}_u
  cp ./templates/* t_${s}_u
  mv ./t_${s}_u/template.c ./t_${s}_u/t_${s}.c
done

答案 4 :(得分:0)


for i in $(seq -w 1 100); do
 mkdir t_${i}_u
 cp templates/* t_${i}_u
 mv t_${i}_u/template.c t_${i}_u/t_${i}.c
done

尚未测试过。

答案 5 :(得分:0)

您可以将printf的结果保存在变量中,而不是每次都重新执行。或者只使用seq -w 1 100生成数字:

for i in $(seq -w 1 100)
do
    d=t_${i}_u
    mkdir $d
    cp templates/* $d
    mv $d/template.c $d/t_$i.c
done