2011-02-26 51 views
0

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

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?" 

感谢您的任何帮助提前。

回答

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?" 

我敢肯定,这可以进一步改进了一下用一次计算目录的名称和重新使用它,但这是更好的,足以我很好,在这里停下来。 :)

+0

非常高兴知道seq -w。感谢你,并感谢所有回答的人。 – Hank 2011-02-26 09:20:10

+0

很好的答案,但'seq'从某些Unices(如Darwin)中缺少...... – maerics 2011-02-26 09:54:49

+0

@maerics:BSD有'jot',但这就是为什么应该使用'printf'。 – 2011-02-26 15:01:15

2

改善脚本最明显的方法是分配一个变量您使用的名称:

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

,那么你可以做

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

感谢这工作,看起来好多吨。 :D – Hank 2011-02-26 09:06:47

+1

+1,但'$()'比反引号更好。 – 2011-02-26 15:02:31

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 
+1

等号周围不应有空格。 – 2011-02-26 15:00:15

+0

@denniswilliamson固定 – maerics 2015-08-31 17:54:26

1

击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 
+0

这只适用于Bash 4.分配'num = $ i'是不必要的,只需直接使用'$ i'即可。 – 2011-02-26 14:59:52

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 

尚未测试它。

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 
相关问题