Jak utworzyć duży plik w systemie UNIX?

17

Znalazłem sposób w Windows na zrobienie czegoś takiego

echo "This is just a sample line appended  to create a big file. " > dummy.txt
for /L %i in (1,1,21) do type dummy.txt >> dummy.txt

http://www.windows-commandline.com/how-to-create-large-dummy-file/

Czy w systemie UNIX istnieje sposób na skopiowanie pliku, dołączenie, a następnie powtórzenie procesu? Coś takiego for .. cat file1.txt > file1.txt?

Thomas Lee
źródło
Po co kopiować plik i dołączać zamiast dołączać?
123
@ 123 append jest dobry, ale jak zrobić pętlę?
Thomas Lee
4
for i in {1..1000000};do echo "string" >> file;donew bash.
123
9
Czy to musi być plik tekstowy? Możesz utworzyć dowolny rozmiar pliku z / dev / zero lub / dev / urandom.
RealSkeptic
2
Spodziewałbym type file >> filesię uruchomić w nieskończonej pętli (przynajmniej gdy będzie wystarczająco duży, aby nie zmieścił się w buforze).
Stéphane Chazelas,

Odpowiedzi:

29
yes "Some text" | head -n 100000 > large-file

Z csh/ tcsh:

repeat 10000 echo some test > large-file

Z zsh:

{repeat 10000 echo some test} > large-file

W systemach GNU zobacz także:

seq 100000 > large-file

Lub:

truncate -s 10T large-file

(tworzy rzadki plik 10TiB (bardzo duży, ale nie zajmuje miejsca na dysku)) i inne alternatywy omówione w temacie „Utwórz plik testowy z dużą ilością zerowych bajtów” .


Robienie cat file >> filebyłoby złym pomysłem.

Po pierwsze, nie działa z niektórymi catimplementacjami, które odmawiają odczytu plików, które są takie same jak ich plik wyjściowy. Ale nawet jeśli obejdziesz ten proces cat file | cat >> file, jeśli filejest większy niż catbufor wewnętrzny, spowodowałoby catto uruchomienie w nieskończonej pętli, ponieważ w rezultacie odczytałby wcześniej zapisane dane.

W systemach plików zabezpieczonych obrotowym dyskiem twardym byłoby to również dość nieefektywne (po osiągnięciu rozmiaru większego niż prawdopodobnie buforowany w pamięci), ponieważ dysk musiałby iść w tę iz powrotem między miejscem, w którym można odczytać dane, i gdzie to napisać.

Stéphane Chazelas
źródło
19
Lub dd if=/dev/zero of=large-file bs=1024 count=1024plik 1 MB
doneal24
7
@ DougO'Neal Uważam, że jestem dd if=/dev/zero of=test bs=1M count=1jaśniejszy.
123
4
@ DougO'Neal, patrz Tworzenie pliku testowego z dużą ilością zerowych bajtów
Stéphane Chazelas
1
Lub użyj / dev / urandom zamiast / dev / zero, jeśli chcesz losowych danych.
user253751,
3
@ robertotomás tak, wszyscy używają dd, ale nigdy nie rozumiem dlaczego. W rzeczywistości myślę, że użyłem go tylko do odczytu MBR lub podobnych zadań pobocznych. Z mojego doświadczenia wynika, że ​​inne narzędzia są szybsze, prostsze i bezpieczniejsze w zdecydowanej większości przypadków, w których ludzie używają dd. Myślę, że jest to jeden z tych przypadków, w których częste! = Optymalne, takie jak sudo sulub cat file | grep foo.
terdon
22

Możesz utworzyć duży plik w systemie Solaris, używając:

mkfile 10g /path/to/file

Kolejny sposób, który działa w systemie Solaris (i Linux):

truncate -s 10g /path/to file

Możliwe jest również użycie:

dd if=/dev/zero of=/path/to/file bs=1048576 count=10240
Lambert
źródło
dd jeden jest jak terabajt
123
1
Zdefiniuj „duży plik” :-) Ale edytowałem, ponieważ wszystkie inne próbki mają stan 10 g ...
Lambert
truncate Nie można wykonać „truncate”. Brak takiego pliku lub katalogu Truncate wydaje się być tylko Linuksem.
schily
truncateistnieje w systemie Solaris 11.2+
Lambert
11

Najszybszym możliwym sposobem utworzenia dużego pliku w systemie Linux jest fallocate:

sudo fallocate -l 2G bigfile

fallocatemanipuluje systemem plików i faktycznie nie zapisuje domyślnie w sektorach danych, i jako taki jest niezwykle szybki. Minusem jest to, że musi być uruchamiany jako root.

Uruchamiając go kolejno w pętli, możesz wypełnić największy system plików w ciągu kilku sekund.

Od man fallocate

fallocate służy do manipulowania przydzielonym miejscem na dysku dla pliku, zarówno w celu zwolnienia, jak i wstępnego przydzielenia.
W przypadku systemów plików, które obsługują wywołanie systemowe Fallocate, wstępna alokacja odbywa się szybko przez przydzielenie bloków i oznaczenie ich jako niezainicjowanych, nie wymagając we / wy bloków danych. Jest to o wiele szybsze niż tworzenie pliku przez wypełnienie go zerami.
Obsługiwany dla XFS (od Linuksa 2.6.38), ext4 (od Linux 3.0), Btrfs (od Linux 3.7) i tmpfs (od Linux 3.5).

Rui F. Ribeiro
źródło
1
To powinna być zaakceptowana odpowiedź. Łatwo i szybko.
ardochhigh
8

To będzie kontynuowane, dopóki nie CTRL-C:

yes This is stuff that I want to put into my file... >> dummy.txt

Bądź jednak ostrożny, ponieważ możesz uzyskać setki tysięcy linii na sekundę ...

Od man yes:

yes - output a string repeatedly until killed
Znak zapytania
źródło
Jest to bardzo łatwa metoda na utworzenie dużego pliku w środowisku Linux.
Chaminda Bandara
1
yes $BIG_STRING | head -c $TARGET_SIZE >> dummy.txtpozwoli ci uzyskać dokładną kwotę. (-n $ TARGET_NUMBER_OF_LINES). yesautomatycznie umrze w wyniku „zepsutej rury”, gdy zostanie headzakończona, ponieważ liczba docelowa została osiągnięta.
PypeBros,
4

Jeśli dobrze cię rozumiem, szukasz czegoś takiego:

echo "test line" > file;
for i in {1..21}; do echo "test line" >> file; done

Spowoduje to utworzenie pliku z 22 powtórzeniami „linii testowej”. Jeśli chcesz określonego rozmiaru pliku, możesz użyć czegoś takiego (w systemie Linux). 1024 to jeden kilobajt:

while [ $(stat -c "%s" file) -le 1024 ]; do echo "test line" >> file; done

Osobiście, gdy chcę utworzyć duży plik, używam dwóch plików i łączę je między sobą. Możesz powtarzać proces, aż osiągniesz pożądany rozmiar (tutaj 1 MB):

echo "test line" > file;
while [ $(stat -c "%s" file) -le 1048576 ]; do 
    cat file >> newfile
    cat newfile >> file
done

Pamiętaj, że to rozwiązanie często przekracza pożądany rozmiar, ponieważ jeśli plik jest poniżej limitu, wszystko zostanie do niego ponownie przywrócone.

Wreszcie, jeśli wszystko, czego chcesz, to plik o pożądanym rozmiarze i nie musisz go tak naprawdę zawierać, możesz użyć truncate:

truncate -s 1M file
terdon
źródło
1
Czy catjednak dodanie pliku ma jakąkolwiek zaletę? Wydawałoby się, że zajęłoby to dłużej, ponieważ musi rozwidlać dwa procesy w każdej pętli, a także przenosić całą zawartość wiele razy.
123
1
@ 123 prędkość. catPodejście jest dużo, dużo szybciej. Ma to sens tylko przy tworzeniu ogromnych plików, ale utworzyło to plik 545M w 10 sekund na moim komputerze. Ta sama whilepętla z echo "test line" >> fileutworzonym plikiem 96K w tym samym czasie.
terdon
Myślę, że z podejściem „kota” jest to, że rośnie wykładniczo. Po rozpoczęciu drugiej iteracji „newfile” ma już 1 linię, a „file” ma 2, a po zakończeniu „newfile” ma teraz 3 linie, a „file” 5. Następnie „newfile” będzie mieć 8, a „ plik ”będzie 13. Następny (21, 34) itd.
PypeBros
minus: może zająć więcej miejsca na dysku (> = 1,5 * pożądany rozmiar) niż docelowy rozmiar pliku podczas tworzenia pliku.
PypeBros,
btw. Jeśli masz w truncatepobliżu, możesz truncate -s 1Gutworzyć plik na pierwszym miejscu. unix.stackexchange.com/a/269184/85549 . Możesz zastąpić go przez head -c $DESIRED_SIZE, być może w whilepętli.
PypeBros,
3

Pipingując zawartość /dev/urandomdo headmożesz przekierować dane wyjściowe do pliku, więc:

 cat /dev/urandom | head --bytes=100 >> foo.bar

Otrzymasz plik ze 100 bajtami śmieci.

wydać
źródło
1
echo "This is just a sample line appended  to create a big file. " > dummy.txt
i=1
while [ $i -le 21 ]
do
  cat dummy.txt >> bigfile
  cat bigfile > dummy.txt
  (( i++ ))
done

taki sam efekt skryptu Windows, ale w bash nie można bezpośrednio połączyć pliku z samym sobą.

MelBurslan
źródło
Oprócz zapomnienia .txtrozszerzenia na końcu pozostawiasz 2 duże pliki.
ott--