2013-10-25 138 views
8

我开始学习如何在Linux中使用bash shell命令和脚本。用脚本在bash中创建文件的多个副本

我想创建一个脚本,它将获取一个源文件,并创建一个选定数量的命名副本。

例如,我的源代码是testFile,我选择了15个副本,因此它在同一位置创建了testFile1,2,3 ... 14,15。

要尝试实现这一点,我试图让下面的命令:

for LABEL in {$X..$Y}; do cp $INPUT $INPUT$LABEL; done 

然而,而不是创建从X文件到Y,这让只有一个文件,(例如){1 .. 5}而不是文件1,2,3,4和5

如何更改它,以便正确使用变量作为循环的数字?

+0

相关,如果不是很重复。 .. http://stackoverflow.com/questions/14990185/make-multiple-copies-of-files-with-a-shell-script – beroe

回答

6

brace expansion机制有点局限;它不适用于变量,仅适用于文字。

你想要的东西,你可能有seq命令,可以这样写:

INPUT=testFile 
for num in $(seq 1 15) 
do 
    cp "$INPUT" "$INPUT$num" 
done 
+0

我试过这个命令,但得到这个错误:./copymany.sh:第14行: $ {seq 1 15}:不好的替换 –

+0

我删除了一个我的代码的字面上只是粘贴了你的命令,它说“cp:在'1'之后缺少目标文件操作数(并且其他每个数字都为15” –

+0

我使用了括号('()');你最初的代码显示'{}'大括号。你没有显示'$ INPUT'是如何设置的,所以我不能设置它,但是错误消息意味着你的'cp'命令只能看到数字,这意味着'$ INPUT'没有设置。您需要将其添加到您的代码中。另外,将文件名用双引号括起来也是个好主意。这应该不重要,因为你可能没有名字中的空格等等,但是很容易证明安全而不是抱歉。 –

2

使用C风格的for循环

$ x=0 y=15 
$ for ((i=x; i<=y; i++)); do cp "$INPUT" "$INPUT$i"; done 
+0

太棒了,非常感谢。有没有办法修改,让它采取字母(A-Z)以及数字? –

+0

另外,为什么这个如果我在命令行输入它的工作,但如果我尝试运行它作为一个脚本称为copymany.sh它说 “cp:can stat”:没有这样的文件或目录“ –

+0

'因为我在{a..z}; do ...' –