如何在 UNIX 中创建大文件?

如何在 UNIX 中创建大文件?

我在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

答案1

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陷入无限循环,因为它最终会读取它之前写入的数据。

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

答案2

您可以使用以下命令在 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

答案3

在 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 起)。

答案4

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

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

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

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

相关内容