bash:如何快速将一个文件的多个副本复制到另一个文件?

时间:2015-10-12 18:11:41

标签: bash cat replicate

我需要通过提供逐渐变大的输入文件来对程序进行压力测试。我有一个输入文件inputSmall.txt,我想将N次复制cat并将N个副本复制到同一个文件中。 N=1000是大文件。如果有任何比下面的简单循环更快的工作(例如for i in {1..1000} do cat inputSmall.txt >> input1000.txt done ):

inputN.txt

我的机器有足够的磁盘空间来存储N非常大的{{1}}并且有很多RAM,以防它相关。

THX

3 个答案:

答案 0 :(得分:0)

写作时

for i in {1..1000}

您告诉shell首先将1到1000之间的所有数字写入命令缓冲区,然后遍历每个数字。对于大数字而言,这不仅很慢,而且还增加了大量内存需求(例如,请参见unix.se上的this post)。

在bash中,您可以使用以下语法来避免所有这些:

for ((i=1; i<=1000;i++))

作为奖励,这允许边界是变量。

答案 1 :(得分:0)

通过这种方式,您可以更快地执行此操作并且#34;指数&#34;,但您需要为tmp文件提供一些额外的磁盘空间。

input=$1

new=${input}.new.txt
tmp=${input}.tmp.txt

cat ${input} > ${new}
cat "" > ${tmp}

# 2^10=1024
for ((i=0; i<10 ; i++))
do
        cat ${new} >> ${tmp}
        cat ${tmp} >> ${new}
done

rm ${tmp}

答案 2 :(得分:0)

cat是一个外部命令,而不是shell的一部分;像所有外部命令一样,启动它会产生很大的开销。类似地,运行>>input1000.txt是一个相当昂贵的文件系统操作 - 查找与目录关联的inode,打开它,然后(在离开范围时)刷新内容并关闭文件。

只做一次这样的事情会更有效率。

假设inputSmall.txt的最后一行以换行符结尾,以下内容将正常运行,并且开销更少:

in=$(<inputSmall.txt)        # read the input file only once
exec 3>>input1000.txt        # open the output file only once

for ((i=0; i<1000; i++)); do
  printf '%s\n' "$in" >&3    # write the input from memory to the output fd
done
exec 3>&-                    # close the output fd