0

我们需要构建一个大小约为 1MB 的大型文本文件。我们尝试使用 Echo 使用 shell 脚本使用 do 循环创建文件。建造花了很长时间。

我正在寻找在 unix/Linux 中构建文件 1 行/记录。它可能是一个大小为 1MB 的大字符串。

内容可能看起来像这样,但对于整兆字节:

XXXXXXXXX............................................XXXX

如果我逐个角色构建,则需要更长的时间。

我想稍后将其扩展到 10MB、20MB .... 60MB。

shell 脚本是最好的选择,还是有更快的选择?

4

4 回答 4

6

unixdd命令正是为此目的而制定的。

http://en.wikipedia.org/wiki/Dd_%28Unix%29

您可以编写一个小程序来连续将所需的填充字符(X在您的示例中)打印到 STDOUT 而无需换行符。将结果输入dd并指定bscount参数,以便获得完全正确的文件大小。

然后,您可以调整bscount参数以找到最大吞吐量。

编辑:示例:

yes X | awk '{ printf("%s", $0)}' | dd of=out.txt bs=1024 count=1024 2>/dev/null

你可以看到它非常快:

time yes X | awk '{ printf("%s", $0)}' | dd of=out.txt bs=1024 count=1024 
1024+0 records in
1024+0 records out
1048576 bytes (1.0 MB) copied, 0.123118 s, 8.5 MB/s

real    0m0.127s
user    0m0.144s
sys         0m0.004s

移动time通过管道的不同部分向我表明,dd无论你给它什么,但生产者并不是很快。(也许并不是最好的组合)yesawk

如果您需要比这更快,也许您需要考虑其他接口,例如mmap.

于 2013-08-03T03:08:47.147 回答
1

你可以使用“dd”命令

见下面的例子

dd if=/dev/zero of=LARGE_FILE bs=1M count=10000

于 2013-08-03T03:39:41.977 回答
1

您可以使用/dev/zero,tr和的组合head

这将生成一个带有 A:s 的 1MB 文件:

cat /dev/zero | tr '\0' A | head -c 1000000 > A.txt
于 2019-07-18T14:46:01.870 回答
1
指定字节数——在本例中为 1024
printf 'B%.0s' {1..1024} > test; du -b test
    1024    test
指定千字节数(二进制千字节)——在本例中为 76
K=`printf 'B%.0s' {1..1024}`; printf "$K"'%.0s' {1..76} > test; ls -sh test
    76K test
指定兆字节数(二进制兆字节)——在本例中为 45
K=`printf 'B%.0s' {1..1024}`; M=`printf "$K"'%.0s' {1..1024}`; printf "$M"'%.0s' {1..45} > test; ls -sh test
    45M test
指定网络的千比特数 - 在本例中为 2
kbit=`printf 'B%.0s' {1..125}`; printf "$kbit"'%.0s' {1..2} > test; cat test; echo

    BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
    BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
    BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
    BBBBBBBBBB
指定网络的兆比特数——在本例中为 2
kbit=`printf 'B%.0s' {1..125}`; mbit=`printf "$kbit"'%.0s' {1..1000}`; printf "$mbit"'%.0s' {1..2} > test
于 2019-09-25T19:30:51.437 回答