如何创建一个touch
具有特定大小(例如 14 MB)的文件(例如使用命令或其他类似方式)?
用例是使用各种文件大小测试 FTP。如果我们可以创建一个具有特定大小的文件,它将对验证 FTP 传输等很有用。
答案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)。在这些情况下,您可能需要使用dd
或head
代替。
答案2
编辑:最简单的方法可能是truncate
Ashutosh Vishwa Bandhu 的回答,但正如@offby1创造稀疏文件这可能不是您想要的。以下解决方案将创建正常的完整文件。
以下命令创建一个名为 14MB 的文件foo
:
fallocate
(谢谢@突破谁在评论中建议并投票赞成 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
或者
head -c 14MB /dev/urandom > foo
创建一个填充有 s 的文件
\0
:dd if=/dev/zero of=foo.txt bs=14MB count=1
或者
head -c 14MB /dev/zero > foo
创建一个文件,其中包含另一个文件的前 14MB 数据:
head -c 14MB bar.txt > foo
创建一个文件,其中包含另一个文件的最后 14MB 数据:
tail -c 14MB bar.txt > foo
在所有上述示例中,文件将是14*1000*1000
(如果需要)14*1024*1024
,请将其替换MB
为M
。例如:
dd if=/dev/urandom of=foo bs=14M count=1
head -c 14M /dev/zero > foo
fallocate
仅以字节为单位处理,因此您必须执行(14*1024*1024=14680064)
fallocate -l 14680064 foo
答案3
dd bs=1MB count=14 if=/dev/zero of=<yourfilename>
警告 dd
会默默覆盖任何事物您有写入权限,无论您是自愿还是无意指定。请确保您理解dd
,例如阅读dd --help
,并且不要搞砸您的 dd 命令行,否则您很容易造成不可逆转的数据丢失 -甚至总计。
首先if=
,输入文件并且of=
是输出文件。总是在运行命令之前,请仔细检查您是否正确。:)
答案4
这应该是最快的方法:
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 保证分配指定的范围,因此如果它成功返回,您在后续使用该范围时不会遇到磁盘已满的情况