如何从命令行创建具有特定大小的文件?

如何从命令行创建具有特定大小的文件?

如何创建一个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)。在这些情况下,您可能需要使用ddhead代替。

答案2

编辑:最简单的方法可能是truncateAshutosh Vishwa Bandhu 的回答,但正如@offby1创造稀疏文件这可能不是您想要的。以下解决方案将创建正常的完整文件。


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

  1. 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
    
  2. 创建一个充满随机数据的文件

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

                                                                              或者

    head -c 14MB /dev/urandom > foo
    
  3. 创建一个填充有 s 的文件\0

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

                                                                              或者

    head -c 14MB /dev/zero > foo
    
  4. 创建一个文件,其中包含另一个文件的前 14MB 数据:

    head -c 14MB bar.txt > foo
    
  5. 创建一个文件,其中包含另一个文件的最后 14MB 数据:

    tail -c 14MB bar.txt > foo
    

在所有上述示例中,文件将是14*1000*1000(如果需要)14*1024*1024,请将其替换MBM。例如:

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 保证分配指定的范围,因此如果它成功返回,您在后续使用该范围时不会遇到磁盘已满的情况

相关内容