如何在 UNIX 中创建大文件?

Tho*_*Lee 25 shell files

我在 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
Run Code Online (Sandbox Code Playgroud)

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

在 UNIX 中有没有办法复制文件、追加然后重复该过程?像for .. cat file1.txt > file1.txt什么?

Sté*_*las 37

yes "Some text" | head -n 100000 > large-file
Run Code Online (Sandbox Code Playgroud)

与csh/ tcsh:

repeat 10000 echo some test > large-file
Run Code Online (Sandbox Code Playgroud)

与zsh:

{repeat 10000 echo some test} > large-file
Run Code Online (Sandbox Code Playgroud)

在 GNU 系统上,另见:

seq 100000 > large-file
Run Code Online (Sandbox Code Playgroud)

或者:

truncate -s 10T large-file
Run Code Online (Sandbox Code Playgroud)

(创建一个 10TiB 稀疏文件(非常大但不占用磁盘空间))以及“创建具有大量零字节的测试文件”中讨论的其他替代方案。


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

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

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

  • 或者 `dd if=/dev/zero of=large-file bs=1024 count=1024` 对于 1MB 文件 (19认同)
  • @DougO'Neal 我发现 `dd if=/dev/zero of=test bs=1M count=1` 更清楚。 (7认同)
  • @DougO'Neal,参见[创建一个包含大量零字节的测试文件](http://unix.stackexchange.com/q/102613) (4认同)
  • @robertotomás 是的,每个人都使用 `dd`,但我一直不明白为什么。事实上,我想我只用它来读取 MBR 或类似的边缘任务。根据我的经验,对于人们使用 `dd` 的绝大多数情况,其他工具更快、更简单、更安全。我认为这是 common != 最佳的情况之一,例如 `sudo su` 或 `cat file | grep foo`。 (3认同)

Lam*_*ert 22

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

mkfile 10g /path/to/file
Run Code Online (Sandbox Code Playgroud)

另一种适用于 Solaris(和 Linux)的方法:

truncate -s 10g /path/to file
Run Code Online (Sandbox Code Playgroud)

也可以使用:

dd if=/dev/zero of=/path/to/file bs=1048576 count=10240
Run Code Online (Sandbox Code Playgroud)


Rui*_*iro 13

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

sudo fallocate -l 2G bigfile
Run Code Online (Sandbox Code Playgroud)

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

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

从 man fallocate

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


Que*_*ark 10

这将一直持续到您按下 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
Run Code Online (Sandbox Code Playgroud)


ter*_*don 5

如果我理解正确的话,你正在寻找类似的东西:

echo "test line" > file;
for i in {1..21}; do echo "test line" >> file; done
Run Code Online (Sandbox Code Playgroud)

这将创建一个包含 22 次重复“测试行”的文件。如果你想要一个特定的文件大小,你可以使用类似的东西(在Linux上)。1024 是 1 KB:

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

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

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

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

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

truncate -s 1M file
Run Code Online (Sandbox Code Playgroud)