我正在编写一个脚本来下载多个部分的文件,我正在加入这些文件。我可以使用
加入脚本之外的部分cat name.part{0..4} > name.ext
但是,如果我在剧本中使用它
cat $filename.part{0..$N} > $filename
我得到:
cat: Bitcoin-960x623.jpg.part{0..5}: No such file or
答案 0 :(得分:4)
{0..4}
是支撑扩张; $N
是一个变量扩展。您的表达式无法正常工作,因为大括号扩展在变量扩展之前发生:
扩展的顺序是:大括号扩展,波浪扩展,参数,变量,算术扩展和命令替换(以从左到右的方式完成),单词拆分和文件名扩展。
http://www.gnu.org/software/bash/manual/bashref.html#Shell-Expansions
您可以使用seq
command代替大括号扩展来生成所需的文件名,最多为N:
$ filename=myfile
$ N=4
$ cat $(seq -f "$filename.part%g" 0 $N) > name.ext
$
如果seq -f
不可用,则可以使用for循环单行代码:
$ cat $(for ((i=0; i<N; i++)); do echo "$filename.part$i"; done) > name.ext
$
答案 1 :(得分:3)
我解决了这个问题。
for (( k=0 ; k<=$N ; k++ ))
do
cat $filename.part$k >> $filename
done
答案 2 :(得分:2)
您不能在shell中使用花括号内的变量。 eval
可以在这里使用:
eval "$filename.part{0..$N} > $filename"
答案 3 :(得分:2)
断言:我会争辩说这个答案是更好。 (我不经常或轻易做的事情。)我的理由是,在编辑时所有其他答案都扩展到一系列整数,无论是否存在与这些整数匹配的文件。通过使用glob扩展,您可以保证不会遇到来自No such file or directory
的{{1}}。在括号扩展,eval,cat
和for循环的所有其他情况下,您必须明确检查。
如果文件名总数少于10个:
seq
将以glob形式扩展到有多少名称。这是一种快速便携的解决方案,但显然有限。如果有超过10个,那么该模式只匹配一个数字的模式,所以你必须更加有点使用extglob:
cat "$filename".part[0-9]
应该这样做,但这只适用于Bourne-Again SHell。 (也就是说,其他一些现代炮弹的扩展能力与extglob相似。)