Mam plik xml o pojemności 150 GB, który chciałbym skrócić (tj. Skrócić) do około 1 GB - czy mogę użyć prostej (bash lub podobnej) komendy, której mogę użyć, czy też muszę przejść ścieżkę programową (edycję w vi lub emacs jest koszmarem nawet na dużych żelaznych systemach)?
(Nie jestem szczególnie zaniepokojony utratą informacji, chcę mieć krótszy plik, aby móc na nim przetestować oprogramowanie i nie czekać wiele godzin na odpowiedź, krótszy plik pozwoli mi to zrobić.)
bash
unix
file-management
adrianmcmenamin
źródło
źródło
Odpowiedzi:
Zakładając, że chcesz obciąć i wyodrębnić pierwszy 1 GB ze 150 GB pliku:
Z
head
:head -c 1G infile > outfile
Zauważ, że
G
sufiks można zastąpić,GB
aby wyrównać do 1000 zamiast 1024.Lub z
dd
:dd if=infile of=outfile bs=1M count=1024
Lub jak w odpowiedzi Wumpusa Q. Wumbley
dd
może zostać obcięty w miejscu.źródło
Aby skrócić plik do 1 gigabajta, użyj
truncate
polecenia:Wynik obcięcia prawdopodobnie nie będzie prawidłowym plikiem XML, ale rozumiem, że to rozumiesz.
Dokumentacja dla wersji GNU
truncate
jest tutaj, a dokumentacja dla wersji BSD jest tutajźródło
Tam, gdzie to możliwe,
truncate
używałbym polecenia jak w odpowiedzi John1024. Nie jest to jednak standardowe polecenie unix, więc może kiedyś nie będziesz mógł go użyć. W takim przypadkudd
można również wykonać obcinanie na miejscu.dd
domyślnym zachowaniem jest obcięcie pliku wyjściowego w punkcie, w którym kończy się kopiowanie, więc po prostu dajesz mu plik wejściowy o długości 0 i każesz mu rozpocząć zapis w żądanym punkcie obcięcia:(To nie jest to samo, co kopiowanie i obcinanie
dd
w odpowiedzi multithr3at3d.)Zauważ, że użyłem 1048576 i 1024, ponieważ 1048576 * 1024 to pożądany rozmiar. I unikać bs = 1m, ponieważ jest to „przenośność” odpowiedź, a klasyczny
dd
zna tylko przyrostkówk
,b
orazw
.źródło
bs
liczba pomnożona przezseek
liczbę jest liczbą bajtów do zachowania. Wszelkie dwie liczby spełniające to ograniczenie powinny działać; np .bs=1073741824 seek=1
lubbs=1 seek=1073741824
. Lub, ponieważbs
domyślnie jest 512,seek=2097152
sam powinien również działać. I można użyć notacji jak1M
,1K
,1G
i2M
.Nie jestem do końca pewien, o co pytasz. Czy chcesz po prostu pozbyć się pozostałych 149 GB, czy próbujesz skompresować 150 GB do 1 GB? Niezależnie od tego może to być przydatna metoda osiągnięcia tego celu.
split
Polecenie może podzielić każdy plik na kilka kawałków. Zobacz podział człowieka . Możesz określić rozmiar fragmentów pliku, na które chcesz go podzielić za pomocą-b
opcji. Na przykład:$ split -b 1 GB mój_plik.xml
Bez żadnych innych opcji powinno to utworzyć kilka plików w bieżącym katalogu, zaczynając od litery
x
. Jeśli chcesz zmienić nazwy podzielonych plików, zajrzyj na stronę manuala.Aby ponownie złożyć plik, wystarczy użyć
cat * > re-assembled.xml
.Przykład:
źródło
Możesz użyć
split
polecenia.Aby uzyskać więcej informacji, zapoznaj się z odpowiedzią dotyczącą przepełnienia stosu
źródło
W końcu użyłem tylko
sed
do wyodrębnienia dowolnej liczby wierszy:źródło
sed 1000000q
(i nieco bardziej zwarty, wizualnie).