Jak stworzyć plik o podanym rozmiarze w systemie Linux?

157

Do celów testowych muszę wygenerować plik o określonym rozmiarze (aby przetestować limit wysyłania).

Co to jest polecenie utworzenia pliku o określonym rozmiarze w systemie Linux?

Grundlefleck
źródło
duży stackoverflow.com/questions/257844/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Odpowiedzi:

187
dd if=/dev/zero of=upload_test bs=file_size count=1

Gdzie file_sizejest rozmiar twojego pliku testowego w bajtach

Ilya Kochetov
źródło
Och, to może być bardziej wydajne niż moje podejście, ponieważ robi to wszystko w jednym bloku. Dobry pomysł.
Paul Tomblin
10
W rzeczywistości użycie dużego rozmiaru bloku będzie działać znacznie gorzej, gdy stanie się bardzo duży, ponieważ alokuje i odczytuje tę ilość do pamięci przed zapisaniem. Jeśli jest to coś podobnego do bs = 4GiB, prawdopodobnie skończysz na zamianie.
Brian,
35
ddma limit 2 ^ 32 dla jej wartości, tak aby utworzyć plik większy niż 4 GB, istnieje trik: dd if=/dev/zero of=test bs=1M count=<size in megabytes>.
Dmytro Sirenko
2
Zobacz następną odpowiedź, aby uzyskać lepsze i szybsze podejście
eleganckie kości
2
@elegant dice nie jest jasne, która odpowiedź jest następna, mogą zmienić swoją pozycję
vladkras
160

Proszę, nowoczesność jest łatwiejsza i szybsza. W systemie Linux (wybierz jedną)

truncate -s 10G foo
fallocate -l 5G bar

To wymaga , aby stwierdzić, że truncatew systemie plików wspierające pliki rozrzedzone utworzy plik rozrzedzony i fallocatenie będzie. Plik rzadki to taki, w którym jednostki alokacji tworzące plik nie są w rzeczywistości przydzielane, dopóki nie zostaną użyte. Metadane dla pliku zajmą jednak trochę miejsca, ale prawdopodobnie nie będzie w pobliżu rzeczywistego rozmiaru pliku. Aby uzyskać więcej informacji, zapoznaj się z zasobami dotyczącymi rzadkich plików, ponieważ ten typ pliku ma zalety i wady. Plik nierzadki ma swoje bloki (jednostki alokacji) alokowane z wyprzedzeniem, co oznacza, że ​​miejsce jest zarezerwowane tak długo, jak widzi to system plików. Również fallocateani truncatenie ustawi zawartość pliku do określonej wartości , takich jak dd, zamiast tego zawartość pliku zaalokowanego z fallocatelub truncatemoże być jakąkolwiek wartością kosza, która istniała w przydzielonych jednostkach podczas tworzenia, a to zachowanie może być pożądane lub nie. ddJest najwolniejsza, ponieważ faktycznie zapisuje wartość lub porcji danych dla całego strumienia pliku zgodnie z nim w opcji wiersza poleceń.

To zachowanie może być potencjalnie inne - w zależności od używanego systemu plików i zgodności tego systemu plików z dowolnym standardem lub specyfikacją. Dlatego zaleca się przeprowadzenie odpowiednich badań w celu upewnienia się, że zastosowano odpowiednią metodę.

jørgensen
źródło
Próbowałem truncate. Utworzył plik o rozmiarze zerowym przy użyciu powyższej składni. „Strona fallocatepodręcznika ” dla mówi, że tworzone przez niego pliki są spaceraczej puste niż dane. Wydaje się, że nie byłoby to przydatne w niektórych oczekiwanych przypadkach, takich jak „ile czasu zajmuje skopiowanie pliku 1G”.
Mark Stosberg,
6
Wydaje się, że fallocate działa dobrze dla mnie. Tworzy plik o odpowiednim rozmiarze.
Aater Suleman
5
To najlepsza odpowiedź na to pytanie. Truncate / fallocate nie trwa długo, ponieważ nie zapisuje wszystkich bloków pliku. Ale gdybyś przesłał gdzieś wynikowy plik, odczytałby zera dla całej rzeczy.
Mike Andrews
4
Jeśli chcesz uruchomić to pod OSX, to trzeba to zrobić: brew install coreutils. To doda g przed komendą, więc trzeba uruchomić go tak: gtruncate -s 10G foo. Mam nadzieję że to pomoże!
DerekE
Wygląda na to, że nie działa na NTFSpartycji.
eloyesp
40

Aby śledzić post Toma , możesz użyć dd do tworzenia rzadkich plików:

dd if=/dev/zero of=the_file bs=1 count=0 seek=12345

Spowoduje to utworzenie pliku z „dziurą” w większości uniksów - dane nie zostaną w rzeczywistości zapisane na dysku ani nie zajmą miejsca, dopóki nie zostanie w nim zapisane coś innego niż zero.

Brian
źródło
Ustawienie count = 0 pozwala uniknąć odejmowania bajtu od rozmiaru pliku.
andrewdotn
3
z count=0, bs * seekstaje się rozmiarem pliku
Jayen
24

Na OSX (i najwyraźniej Solaris) mkfilepolecenie jest również dostępne:

mkfile 10g big_file

To tworzy plik o rozmiarze 10 GB o nazwie „duży_plik”. Znalazłem to podejście tutaj.

steve
źródło
Jest to przydatne w sytuacjach takich jak OS X, w których polecenia truncatei fallocatenie są dostępne. dddziała również jak opisano powyżej, chociaż mdotyczy megabajtów, nie M.
user535673
Źle: Tworzy plik 10 GiB (= ~ 10,7 GB).
deser
20

Użyj tego polecenia:

dd if = $ INPUT-FILE of = $ OUTPUT-FILE bs = $ BLOCK-SIZE count = $ NUM-BLOCKS

Aby utworzyć duży (pusty) plik, ustaw $INPUT-FILE=/dev/zero.
Całkowity rozmiar pliku to $BLOCK-SIZE * $NUM-BLOCKS.
Nowy utworzony plik będzie $OUTPUT-FILE.

Grundlefleck
źródło
Dlaczego zadałeś to pytanie?
Henry B
9
Musiałem poprosić Google o odpowiedź, więc umieściłem ją tutaj, aby można było o niej dyskutować i aktualizować ... wiesz, o co chodzi w całej witrynie?
Grundlefleck
2
Wiem, że ludzie głosują na @Grundlefleck na dziwki XP, ale ma rację - jednym ze sposobów korzystania z tej strony, zgodnie z wyobrażeniami Jeffa i Joela, jest zadanie pytania i odpowiedzi na coś, co właśnie odkryłeś.
Paul Tomblin
3
Dzięki Paul. Chociaż nie przejmuję się tak punktami, przejmuję się rzeczami, które znajduję w Google, które mogą być wadliwe w sposób, o którym nigdy się nie dowiem, chyba że zapytam tutaj. Ludzie powinni czuć się swobodnie, jeśli uważają, że moja społeczność pytań i odpowiedzi należy do mnie, wzrusza ramionami .
Grundlefleck
2
Cytując z często zadawanych pytań: „Można też zadawać własne pytania programistyczne i odpowiadać na nie, ale udawać, że jedziemy na Jeopardy: sformułować je w formie pytania”.
Craig Angus
17

Możesz to zrobić programowo:

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>

int main() {
    int fd = creat("/tmp/foo.txt", 0644);
    ftruncate(fd, SIZE_IN_BYTES);
    close(fd);
    return 0;
}

To podejście jest szczególnie przydatne do późniejszego mmapowania pliku do pamięci.

użyj następującego polecenia, aby sprawdzić, czy plik ma prawidłowy rozmiar:

# du -B1 --apparent-size /tmp/foo.txt

Bądź ostrożny:

# du /tmp/foo.txt

prawdopodobnie wypisze 0, ponieważ jest alokowany jako plik rzadki, jeśli jest obsługiwany przez twój system plików.

zobacz także: mężczyzna 2 otwarty i mężczyzna 2 obcięty

Benedikt Waldvogel
źródło
10

mógłbyś:

[dsm@localhost:~]$ perl -e 'print "\0" x 100' > filename.ext

Gdzie zastępujesz 100 liczbą bajtów, które chcesz zapisać.

dsm
źródło
A także rzeczywisty bajt wypełniający. Potrzebuję "\ xff" i działa dobrze. Dzięki! :)
Ray
10

Niektórych z tych odpowiedzi używasz /dev/zerojako źródła swoich danych. Jeśli testujesz prędkość wysyłania do sieci, może to nie być najlepszy pomysł, jeśli twoja aplikacja wykonuje jakąkolwiek kompresję, plik pełen zer kompresuje się naprawdę dobrze. Użycie tego polecenia do wygenerowania pliku

 dd if=/dev/zero of=upload_test bs=10000 count=1

Mogłem skompresować upload_testdo około 200 bajtów. Możesz więc postawić się w sytuacji, w której myślisz, że przesyłasz plik o rozmiarze 10 KB, ale w rzeczywistości będzie to znacznie mniej.

Sugeruję użycie /dev/urandomzamiast /dev/zero. W ogóle nie mogłem skompresować wyjścia /dev/urandom.

devin
źródło
Mój system wbudowany nie ma /dev/zero, więc /dev/urandomjest dobry.
Fredrick Gauss
9
dd if=/dev/zero of=my_file.txt count=12345
Paul Tomblin
źródło
4
Pamiętaj, że domyślny rozmiar bloku dd to 512 bajtów, więc to polecenie utworzy plik o rozmiarze 12345 * 512 bajtów.
nikt
4

Odpowiedzi jest wiele, ale żadna nie wyjaśniła ładnie, co jeszcze można zrobić. Patrząc na strony podręcznika dla dd , można lepiej określić rozmiar pliku.

Spowoduje to utworzenie pliku /tmp/zero_big_data_file.bin wypełnionego zerami, który ma rozmiar 20 megabajtów:

    dd if=/dev/zero of=/tmp/zero_big_data_file.bin  bs=1M count=20

Spowoduje to utworzenie pliku /tmp/zero_1000bytes_data_file.bin wypełnionego zerami, który ma rozmiar 1000 bajtów:

    dd if=/dev/zero of=/tmp/zero_1000bytes_data_file.bin  bs=1kB count=1

lub

    dd if=/dev/zero of=/tmp/zero_1000bytes_data_file.bin  bs=1000 count=1

  • We wszystkich przykładach bs to rozmiar bloku, a count to liczba bloków
  • Po BLOKACH i BITACH mogą następować następujące przyrostki mnożnikowe: c = 1, w = 2, b = 512, kB = 1000, K = 1024, MB = 1000 * 1000, M = 1024 * 1024, xM = M GB = 1000 * 1000 * 1000, G = 1024 * 1024 * 1024 i tak dalej dla T, P, E, Z, Y.
BЈовић
źródło
3

Jako polecenie powłoki:

< /dev/zero head -c 1048576 >  output
user1772090
źródło
3

Spowoduje to wygenerowanie pliku tekstowego o wielkości 4 MB z losowymi znakami w bieżącym katalogu i jego nazwie „4mb.txt”. Możesz zmienić parametry, aby wygenerować różne rozmiary i nazwy.

base64 /dev/urandom | head -c 4000000 > 4mb.txt
Berkay92
źródło
0

Użyj, fallocatejeśli nie chcesz czekać na dysk.

Przykład:

fallocate -l 100G BigFile

Stosowanie:

Usage:
 fallocate [options] <filename>

Preallocate space to, or deallocate space from a file.

Options:
 -c, --collapse-range remove a range from the file
 -d, --dig-holes      detect zeroes and replace with holes
 -i, --insert-range   insert a hole at range, shifting existing data
 -l, --length <num>   length for range operations, in bytes
 -n, --keep-size      maintain the apparent size of the file
 -o, --offset <num>   offset for range operations, in bytes
 -p, --punch-hole     replace a range with a hole (implies -n)
 -z, --zero-range     zero and ensure allocation of a range
 -x, --posix          use posix_fallocate(3) instead of fallocate(2)
 -v, --verbose        verbose mode

 -h, --help           display this help
 -V, --version        display version
qin
źródło