Jak mogę utworzyć plik o określonym rozmiarze z wiersza poleceń?

125

Jak mogę utworzyć plik (np. Za pomocą touchpolecenia lub w inny podobny sposób), ale o określonym rozmiarze (np. 14 MB)?

Przypadkiem użycia jest przetestowanie FTP z różnymi rozmiarami plików. Jeśli możemy utworzyć plik o określonym rozmiarze, przydatne będzie sprawdzenie transferu FTP itp.

fasil
źródło
9
Powiązane SO pytanie: stackoverflow.com/questions/257844/…
Der Hochstapler

Odpowiedzi:

158

Użyj truncate:

truncate -s 14M filename

Od 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

Uwaga: truncatemoże nie być dostępny w twoim systemie, np. W Mac OS X nie jest domyślnie instalowany (ale możesz go łatwo zainstalować, na przykład za pomocą Macports). W takich przypadkach może być konieczne użycie ddlub headzamiast tego.

Ashutosh Vishwa Bandhu
źródło
2
łał. bardzo miło, nie wiedziałem tego.
n611x007
człowiek mówi wszystko: obetnij - zmniejsz lub
zwiększ
12
Naprawdę bardzo ładnie. Nie touchjest to jednak potrzebne, wystarczy uruchomić truncate -s 14M filename, utworzy filenamebezpośrednio.
terdon
spoko ... właśnie tego szukałem ... dzięki @ oliver-salzburg
fasil
34
Wydaje się, że tworzy to rzadki plik , podczas gdy poniższa odpowiedź (która używa „dd”) nie. Nie wiem, czy różnica jest dla Ciebie ważna, ale pomyślałem, że
zwrócę na
100

EDIT: Najprostszym sposobem jest chyba truncateod Ashutosh Vishwa Bandhu za odpowiedź , ale jak podkreślił @ offby1 który tworzy rzadkich plików , które nie może być to, co chcesz. Poniższe rozwiązania tworzą normalne, pełne pliki.


Następujące polecenia tworzą plik 14 MB o nazwie foo:

  1. fallocate(dzięki @Breakthrough, który zasugerował to w komentarzach i zagłosował na odpowiedź Ahmeda Masuda poniżej, która również o tym wspomina).

    fallocate -l 14000000 foo
    

    To polecenie jest szczególnie imponujące, ponieważ jest tak szybkie jak truncate(natychmiastowe) niezależnie od pożądanego rozmiaru pliku (w przeciwieństwie do innych rozwiązań, które będą spowolnione dla dużych plików), a jednocześnie tworzy normalne pliki, a nie rzadkie:

    $ 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. Utwórz plik wypełniony losowymi danymi

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

                                                                              lub

    head -c 14MB /dev/urandom > foo
    
  3. Utwórz plik wypełniony \0s:

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

                                                                              lub

    head -c 14MB /dev/zero > foo
    
  4. Utwórz plik wypełniony pierwszymi 14 MB danych innego pliku:

    head -c 14MB bar.txt > foo
    
  5. Utwórz plik wypełniony ostatnimi 14 MB danych innego pliku:

    tail -c 14MB bar.txt > foo
    

We wszystkich powyższych przykładach plik będzie, 14*1000*1000jeśli chcesz 14*1024*1024, zastąp MBgo M. Na przykład:

dd if=/dev/urandom of=foo bs=14M count=1
head -c 14M /dev/zero > foo

fallocate zajmuje się tylko bajtami, więc musisz to zrobić (14 * 1024 * 1024 = 14680064)

fallocate -l 14680064 foo
terdon
źródło
2
Dzięki ...
Spełni
2
odradzałbym stosowanie, ddjeśli istnieje prostsze, mniej potencjalnie niszczące podejście.
akolita
3
@ acolyte ja też. To dlatego każde ddrozwiązanie ma alternatywną alternatywę.
terdon
1
Wpis wiki mówi, że nawet dd (z zerami) stworzy rzadki plik, prawda? en.wikipedia.org/wiki/Sparse_file
Michael
1
@ Michael sprawdziłem, dla pewności, i żadne z moich poleceń nie tworzy rzadkich plików. ddPolecenia na stronie wiki jest zupełnie inna i nie korzysta /dev/zero. Jeśli chodzi o to, Mczy MBjest bardziej logiczne, weź to z programistami. Strony podręcznika głowy , ogona i dd jasno stwierdzają, że „MB = 1000 * 1000, M = 1024 * 1024”. Może się różnić w przypadku innych * nixów.
terdon
21
dd bs=1MB count=14 if=/dev/zero of=<yourfilename>

OSTRZEŻENIE dd po cichu zastąpi wszystko, do czego masz prawo pisać, jeśli podasz to dobrowolnie lub przypadkowo. Upewnij się, że rozumiesz dd, np. czytając dd --help, nie psujesz wiersza poleceń dd, w przeciwnym razie możesz łatwo stworzyć nieodwracalną utratę danych - nawet całkowitą .

Na początku if=jest plik wejściowy i of=jest plik wyjściowy . Zawsze sprawdź dokładnie, czy wszystko dobrze się udało, przed uruchomieniem polecenia. :)

n611x007
źródło
13

Użyj magicznej strony podręcznika dd;)

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

powodować 14 MB * 1024 = 14336 KB lub:

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

Otrzymasz plik wyjściowy 14.db.dat wypełniony zerami: D

mirkobrankovic
źródło
8

To powinien być najszybszy sposób na zrobienie tego:

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

W przeciwnym razie po prostu napisz szybki i brudny program w języku C lub Perl, który szuka dokładnej pozycji i zapisuje pojedynczy bajt. Jest to o wiele szybsze niż faktyczne zrzutowanie danych do bloków.

Jeśli chcesz uniknąć plików rzadkich następnie na Linux (i ewentualnie innych systemów) można korzystać fallocate -l <length>z util-linux.

Jeśli jest to niedostępne, a masz system zgodny z POSIX, możesz napisać szybki i brudny program za pomocą wywołania biblioteki posix_fallocate (). posix_fallocate gwarantuje alokację określonego zakresu, aby nie uzyskać pełnego dysku przy kolejnym użyciu zakresu, jeśli zostanie on zwrócony

Ahmed Masud
źródło
6

Chociaż ddjest to przenośny sposób, aby to zrobić, polecenia mkfilei xfs_mkfilesą napisane specjalnie w tym celu i są szybsze:

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

Problem polega na tym, że żadne z poleceń nie jest powszechnie dostępne, więc nie nadają się do pisania przenośnych skryptów. Jeśli jednak robię to interaktywnie za pomocą wiersza polecenia, to są to polecenia, których używam.

Domyślnie tworzą pliki wypełnione zerami, a nie pliki rzadkie (lub „dziurawe”) . Oboje wybierają -nopcję tworzenia rzadkich plików.

Old Pro
źródło
1

Istnieje inna opcja z Perlem:

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

Spowoduje to utworzenie pliku 1KB. Zamień 1024 na dowolną liczbę.

Majid Azimi
źródło