用cat加入文件

时间:2014-01-13 17:50:18

标签: bash join cat

我正在编写一个脚本来下载多个部分的文件,我正在加入这些文件。我可以使用

加入脚本之外的部分
cat name.part{0..4} > name.ext

但是,如果我在剧本中使用它

cat $filename.part{0..$N} > $filename

我得到:

cat: Bitcoin-960x623.jpg.part{0..5}: No such file or 

4 个答案:

答案 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相似。)