如何创建文件(例如,使用touch命令或其他类似方法),但是具有特定大小(例如14 MB)?

用例是测试具有各种文件大小的FTP。如果我们可以创建特定大小的文件,则对验证FTP传输等很有用。

评论

相关的SO问题:stackoverflow.com/questions/257844/…

#1 楼

使用truncate

truncate -s 14M filename


man truncate开始:

DESCRIPTION
   Shrink or extend the size of each FILE to the specified size

[...]

 -s, --size=SIZE
          set or adjust the file size by SIZE


注意:truncate在您的系统上可能不可用,例如在Mac OS X上,默认情况下未安装它(但是您可以轻松地安装它,例如使用macports)。在这些情况下,您可能需要改用ddhead

评论


哇。非常好,我不知道这一点。

–n611x007
2013年6月18日11:28



男人说了一切:截断-将文件的大小缩小或扩展到指定的大小

– ssedano
13年6月18日在12:48

确实很好。虽然不需要触摸,但是您可以简单地运行truncate -s 14M filename,它将直接创建文件名。

– terdon
13年6月18日在13:00

酷...这正是我真正想要的...谢谢@ oliver-salzburg

– fasil
2013年6月18日13:41



这似乎创建了一个稀疏文件,而下面的答案(使用“ dd”)却没有。我不知道差异对您是否重要,但我想指出这一点

–offby1
13年6月18日在17:33

#2 楼

编辑:最简单的方法可能是Ashutosh Vishwa Bandhu的答案的truncate,但正如@ offby1所指出的那样,它创建的稀疏文件可能不是您想要的。下面的解决方案创建普通的完整文件。


以下命令创建一个名为foo的14MB文件:



fallocate(谢谢) @Breakthrough,他在评论中提出了建议,并在下面投票提到了Ahmed Masud的答案,其中也提到了它。)

fallocate -l 14000000 foo


由于该命令速度最快truncate(瞬时),与所需文件大小无关(不同于其他解决方案,后者对于大型文件而言会很慢),但会创建普通文件,而不是稀疏文件:

$ truncate -s 14MB foo1.txt 
$ fallocate -l 14000000 foo2.txt 
$ ls -ls foo?.txt 
    0 -rw-r--r-- 1 terdon terdon 14000000 Jun 21 03:54 foo1.txt
13672 -rw-r--r-- 1 terdon terdon 14000000 Jun 21 03:55 foo2.txt



创建一个充满随机数据的文件

dd if=/dev/urandom of=foo bs=14MB count=1


120 120 43 120 120 120 or 120 120 or 120 or or or or or or or 78 or or or or or or or or or or or or创建一个由14*1000*1000填充的文件:

head -c 14MB /dev/urandom > foo


ÂÂÂÂÂÂÂÂÂ填充w另一个文件的前14MB数据:

dd if=/dev/zero of=foo.txt bs=14MB count=1



创建一个文件,其中填充了另一个文件的最后14MB数据:

head -c 14MB /dev/zero > foo




在上述所有示例中,如果要使用14*1024*1024,则文件为MB,将M替换为fallocate。例如:

head -c 14MB bar.txt > foo


q4312079q只处理字节,因此您必须要做(14 * 1024 * 1024 = 14680064)

tail -c 14MB bar.txt > foo


评论


谢谢...这也将满足我创建所需大小文件的目的...

– fasil
13年6月18日在13:47

如果有更简单,潜在破坏性较小的方法,我建议您不要使用dd。

– acolyte
2013年6月18日15:50

@acolyte我也是。这就是每个dd解决方案都有一个非dd替代方案的原因。

– terdon
13年6月18日在17:54

Wiki条目说,甚至dd(带有零)也会创建一个稀疏文件,不是吗? en.wikipedia.org/wiki/Sparse_file

–迈克尔
13年6月19日在22:01

@Michael我检查了一下,只是为了确定,我的命令都没有产生稀疏文件。 Wiki页面上的dd命令完全不同,并且不使用/ dev / zero。至于M还是MB更具逻辑性,请与开发人员联系。头,尾和dd的手册页都清楚地指出“ MB = 1000 * 1000,M = 1024 * 1024”。在其他* nixes上可能有所不同。

– terdon
2013年6月20日在1:16



#3 楼

dd bs=1MB count=14 if=/dev/zero of=<yourfilename>


警告dd会悄悄地覆盖您有权写的任何内容,如果您随意或无意地指定它。确保您了解dd,例如。阅读dd --help,就不会搞砸dd命令行,否则很容易造成不可逆的数据丢失-甚至是全部丢失。

开始时,if=是输入文件,of=是输出文件。在运行命令之前,请始终仔细检查是否正确。 :)

#4 楼

使用魔术dd;)手册页

$ dd if=/dev/zero of=output.dat  bs=1024  count=14336


导致14MB * 1024 = 14336KB,或者:

$ dd if=/dev/zero of=output.dat  bs=1MB  count=14


然后您将获得14mb output.dat文件,其中填充了零:D

#5 楼

这应该是最快的方法:

SEEK=$SIZE-1
dd if=/dev/zero of=outfile bs=1 seek=$SEEK count=1 


否则,只需编写一个快速且肮脏的C或perl程序,该程序将查找精确位置并编写一个字节。这比实际将数据转储到块上要快得多。

如果要避免稀疏文件,那么在Linux(以及其他系统)上,可以使用fallocate -l <length>中的util-linux。 />如果不可用,并且您拥有POSIX兼容系统,则可以使用posix_fallocate()库调用编写快速而肮脏的程序。 posix_fallocate保证分配指定的范围,因此,如果该范围成功返回,则在以后使用该范围时不会获得磁盘已满的信息

#6 楼

尽管dd是可移植的方法,但命令mkfilexfs_mkfile是专门为此目的编写的,并且速度更快:

mkfile size[b|k|m|g] filename
xfs_mkfile size[b|k|m|g] filename


要注意的是,这两个命令都不是通用的可用,因此它们不适用于编写可移植脚本。但是,如果我通过命令行进行交互操作,那么这些就是我使用的命令。

默认情况下,它们创建零填充文件,而不创建稀疏(或“有孔”)文件。它们都采用-n选项来创建稀疏文件。

#7 楼

Perl还有另一个选项:

perl -e 'print "a" x 1024' > file.txt

这将创建1KB文件。用您喜欢的任何数字替换1024。

评论


我发现这很有用,因为我可以创建一个包含“可读”内容的文件,而不仅仅是任意内容。

–西门拾音器
20-10-13在9:21