如何在UNIX中创建大文件?


17

我在Windows中找到了一种做这种事情的方法

echo "This is just a sample line appended  to create a big file. " > dummy.txt
for /L %i in (1,1,21) do type dummy.txt >> dummy.txt

http://www.windows-commandline.com/how-to-create-large-dummy-file/

在UNIX中,有没有一种方法可以复制文件,追加然后重复该过程?像for .. cat file1.txt > file1.txt什么?


为什么要复制文件并追加而不是仅追加?
2016年

@ 123 append很好,但是如何执行循环?
Thomas Lee

4
for i in {1..1000000};do echo "string" >> file;done猛扑
2016年

9
它一定是文本文件吗?您可以从/ dev / zero或/ dev / urandom中创建任何大小的文件。
RealSkeptic

2
我希望type file >> file在无限循环中运行(至少在它足够大以至于不能容纳在缓冲区中时)。
斯特凡Chazelas

Answers:


29
yes "Some text" | head -n 100000 > large-file

csh/ tcsh

repeat 10000 echo some test > large-file

zsh

{repeat 10000 echo some test} > large-file

在GNU系统上,另请参见:

seq 100000 > large-file

要么:

truncate -s 10T large-file

(创建10TiB稀疏文件(非常大,但不会占用磁盘上的任何空间)),以及“创建具有很多零字节的测试文件”中讨论的其他替代方法。


这样做cat file >> file将是一个坏主意。

首先,它不适用于某些cat拒绝读取与其输出文件相同的文件的实现。但是,即使您这样做cat file | cat >> file,如果file它大于cat的内部缓冲区,也将导致cat无限循环运行,因为最终将读取其先前写入的数据。

在由旋转式硬盘驱动器支持的文件系统上,它的效率也相当低(在达到大于可能缓存在内存中的大小之后),因为驱动器需要在读取数据的位置之间来回移动,以及在哪里写。


19
dd if=/dev/zero of=large-file bs=1024 count=1024为1MB的文件
doneal24

7
@ DougO'Neal我发现dd if=/dev/zero of=test bs=1M count=1更清晰了。
2016年


1
如果需要随机数据,也可以使用/ dev / urandom而不是/ dev / zero。
user253751 '16

3
@robertotomás是的,每个人都使用dd,但是我从来不明白为什么。实际上,我认为我只用它来读取MBR或类似的附带任务。以我的经验,在大多数人使用的情况下,其他工具更快,更简单,更安全dd。我认为这是常见的==最佳的情况之一,例如sudo sucat file | grep foo
terdon

22

您可以使用以下命令在Solaris上创建一个大文件:

mkfile 10g /path/to/file

在Solaris(和Linux)上运行的另一种方法:

truncate -s 10g /path/to file

也可以使用:

dd if=/dev/zero of=/path/to/file bs=1048576 count=10240

dd就像是TB
123年

1
定义“大文件” :-)但是我编辑了,因为其他示例都声明了10g ...
Lambert

截断无法执行“截断”。没有这样的文件或目录Truncate似乎仅是Linux。
schily

truncate在Solaris 11.2+上确实存在
Lambert

11

在Linux系统中创建大文件的最快方法是 fallocate

sudo fallocate -l 2G bigfile

fallocate 操作文件系统,默认情况下不实际写入数据扇区,因此 速度非常快。缺点是它必须以root用户身份运行。

循环运行它,您可以在几秒钟内填满最大的文件系统。

man fallocate

fallocate用于操纵为文件分配的磁盘空间,以取消分配或预分配文件。
对于支持fallocate系统调用的文件系统,可通过分配块并将其标记为未初始化来快速完成预分配,而无需对数据块进行任何IO操作。这比通过用零填充文件来创建文件要快得多。
支持XFS(自Linux 2.6.38起),ext4(自Linux 3.0起),Btrfs(自Linux 3.7起)和tmpfs(自Linux 3.5起)。


1
这应该是公认的答案。简单快速。
ardochhigh

8

这将一直进行到CTRL-C:

yes This is stuff that I want to put into my file... >> dummy.txt

不过要小心,因为您每秒可能会获得数十万行。

来自man yes

yes - output a string repeatedly until killed

这是在Linux环境中创建大文件的非常简单的方法。
Chaminda Bandara

1
yes $BIG_STRING | head -c $TARGET_SIZE >> dummy.txt将让您获得准确的金额。(-n $ TARGET_NUMBER_OF_LINES)。yeshead因为达到目标数目而在终止时由于“断管”而自动死亡。
PypeBros

4

如果我对您的理解正确,那么您正在寻找以下内容:

echo "test line" > file;
for i in {1..21}; do echo "test line" >> file; done

这将创建一个包含22个“测试行”重复项的文件。如果需要特定的文件大小,则可以使用类似的方法(在Linux上)。1024是一千字节:

while [ $(stat -c "%s" file) -le 1024 ]; do echo "test line" >> file; done

就个人而言,当我要创建一个大文件时,我使用两个文件,一个放在另一个文件中。您可以重复该过程,直到达到所需的大小(此处为1MB):

echo "test line" > file;
while [ $(stat -c "%s" file) -le 1048576 ]; do 
    cat file >> newfile
    cat newfile >> file
done

请注意,此解决方案通常会超出所需的大小,因为如果文件小于限制,则所有内容都会再次放入其中。

最后,如果您想要的只是一个所需大小的文件,并且不需要它实际包含任何内容,则可以使用truncate

truncate -s 1M file

1
请问cat荷兰国际集团的文件实际上有任何优势,只是附加有关系吗?似乎需要更长的时间,因为它必须在每个循环中分叉两个进程,并且还要多次移动整个内容。
2013年

1
@ 123速度。该cat方法快得多。它仅对于创建大文件有意义,但在我的计算机上仅用10秒就创建了545M文件。相同的while循环echo "test line" >> file在相同的时间内创建了96K文件。
terdon

我猜想“猫”方法的问题在于它呈指数增长。在开始第二次迭代时,“ newfile”已经有1行,“ file”有2行,完成后,“ newfile”现在是3行,“ file”是5。接下来,“ newfile”将是8,而'文件”将是13。接着(21,34)等
PypeBros

缺点:创建文件时,它可能比目标文件大小占用更多的磁盘空间(> = 1.5 *期望的大小)。
PypeBros

顺便说一句 如果有truncate,您可以truncate -s 1G首先创建文件。unix.stackexchange.com/a/269184/85549。您可以将其替换为head -c $DESIRED_SIZE,可能在while循环内。
PypeBros

3

通过管道的内容/dev/urandom,以head您可以将输出重定向到一个文件,那么:

 cat /dev/urandom | head --bytes=100 >> foo.bar

将为您提供一个包含100字节垃圾的文件。


1
echo "This is just a sample line appended  to create a big file. " > dummy.txt
i=1
while [ $i -le 21 ]
do
  cat dummy.txt >> bigfile
  cat bigfile > dummy.txt
  (( i++ ))
done

与Windows脚本的效果相同,但是在bash中,您无法直接将文件连接到自身。


除了忘记.txt扩展名,您还剩下2个大文件。
ott--
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.