使用 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 
{0..4}是一个

大括号扩展; $N是一个可变的扩展。 您的表达式无法按预期工作,因为大括号扩展发生在变量扩展之前:

扩展

顺序为:大括号扩展、波浪号扩展、参数、变量和算术扩展和命令替换(以从左到右的方式完成)、单词拆分和文件名扩展。

http://www.gnu.org/software/bash/manual/bashref.html#Shell-Expansions

您可以使用 seq 命令而不是大括号扩展来生成所需的文件名,最多为 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
$

我用这个解决了。

for (( k=0 ; k<=$N ; k++ ))
do
cat $filename.part$k >> $filename
done

不能在 shell 中的大括号内使用变量。 eval可以在这里使用:

eval "$filename.part{0..$N} > $filename"

断言:我要争辩说这个答案更好。(我不经常或轻易做的事情。我的理由是,在这次编辑时,这里的所有其他答案都只是扩展到整数范围,无论与这些整数匹配的文件是否存在。通过使用全球扩展,您可以保证不会遇到来自catNo such file or directory。在所有其他情况下,使用大括号扩展、eval、seq 和 for 循环,您必须明确检查。

如果文件名总数少于 10 个:

cat "$filename".part[0-9]

将作为一个全球扩展到有多少名称。这是一个快速且便携的解决方案,但显然受到限制。如果超过 10 个,那么该模式将只匹配一位数字的模式,因此您必须更灵活一点并使用 extglob:

shopt -s extglob
cat "$filename".part+([0-9])

应该这样做,但这只适用于伯恩-再次谢尔。(也就是说,其他几个现代外壳具有类似于extglob的扩展能力。

相关内容

  • 没有找到相关文章

最新更新