題 如何從命令行創建具有特定大小的文件?


如何創建文件(例如使用 touch 命令或其他類似的方式),但具有特定的大小(例如14 MB)?

用例是使用各種文件大小測試FTP。如果我們可以創建具有特定大小的文件,那麼驗證FTP傳輸等將非常有用。


115
2018-06-18 11:14


起源


相關問題: stackoverflow.com/questions/257844/... - Der Hochstapler


答案:


使用 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上它默認沒有安裝(但你可以輕鬆地安裝它,例如使用macport)。在這些情況下,您可能需要使用 dd 要么 head 代替。


150
2018-06-18 11:26



哇。很好,我不知道這個。 - n611x007
man說的全部:截斷 - 縮小或擴展文件的大小到指定的大小 - ssedano
的確很好。該 touch 不需要,你可以簡單地運行 truncate -s 14M filename 它會創造 filename 直。 - terdon
很酷......這就是我所期待的......謝謝@ oliver-salzburg - fasil
這似乎創造了一個 稀疏文件,而下面的答案(使用“dd”)則沒有。我不知道差異對你來說是否重要,但我想我會指出它 - offby1


編輯:最簡單的方法可能是 truncate Ashutosh Vishwa Bandhu的 回答,但正如所指出的那樣 @ offby1 這創造了 稀疏文件 這可能不是你想要的。以下解決方案可創建正常的完整文件。


以下命令創建一個名為14MB的文件 foo

  1. fallocate (謝謝 @突破 誰在評論中提出了這個建議並投票給艾哈邁德·馬蘇德 回答 下面也提到它。)

    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. 創建一個填充的文件 \0S:

    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,替換 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

96
2018-06-18 11:23



謝謝......這也符合我創建所需大小文件的目的...... - fasil
我建議不要使用 dd 如果有一種更簡單,更少潛在破壞性的方法。 - acolyte
@acolyte我也會這樣。這就是每個人的原因 dd 解決方案有一個非dd替代方案。 - terdon
wiki條目說甚至dd(用零)都會創建一個稀疏文件,不是嗎? en.wikipedia.org/wiki/Sparse_file - Michael
@Michael我檢查過,只是為了確定,我的命令都沒有產生稀疏文件。該 dd 維基頁面上的命令完全不同,不使用 /dev/zero。至於是否 M 要么 MB 更合乎邏輯,與開發人員一起討論。手冊頁 頭, 尾巴 和 DD 都明確指出“MB = 1000 * 1000,M = 1024 * 1024”。其他* nix可能會有所不同。 - terdon


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

警告  dd 會默默地覆蓋 什麼 如果您自願或偶然指定,您有權寫信。確保你明白 dd,例如。隨著閱讀 dd --help,你不會搞砸你的dd​​命令行,否則你很容易造成不可逆轉的數據丟失 - 甚至總數

首先, if= 是個 輸入文件 和 of= 是個 輸出文件總是 在運行命令之前,請仔細檢查是否正確。 :)


21
2018-06-18 11:23





使用魔法 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


13
2018-06-18 11:20





這應該是最快的方法:

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保證分配指定的範圍,因此如果成功返回,則在後續使用範圍時不會獲得磁盤已滿


8
2018-06-19 04:05





dd 這是命令的可移植方式 mkfile 和 xfs_mkfile 是專門為此目的編寫的,速度更快:

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

問題在於,這兩個命令都不是普遍可用的,因此它們不適合編寫可移植腳本。但是,如果我通過命令行以交互方式進行,那些就是我使用的命令。

默認情況下,他們創建零填充文件而不是 稀疏(或“多孔”)文件。他們都拿走了 -n 改為創建稀疏文件的選項。


6
2018-06-20 04:59





Perl還有另一種選擇:

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

這將創建1KB文件。用你喜歡的任何數字替換1024。


1
2017-12-11 20:00