Utwórz archiwum tar podzielone na bloki o maksymalnym rozmiarze

83

Muszę wykonać kopię zapasową dość dużego katalogu, ale jestem ograniczony przez rozmiar poszczególnych plików. Chciałbym zasadniczo utworzyć tar.(gz|bz2)archiwum, które jest podzielone na maksymalnie 200 MB archiwów. Clonezilla robi coś podobnego do tego, dzieląc kopie zapasowe obrazów o takich nazwach:

sda1.backup.tar.gz.aa
sda1.backup.tar.gz.ab
sda1.backup.tar.gz.ac

Czy mogę to zrobić za pomocą jednego polecenia? Rozumiem, jak korzystać z splitpolecenia, ale nie chciałbym tworzyć jednego gigantycznego archiwum, a następnie dzielić go na mniejsze archiwa, ponieważ podwoiłoby to miejsce na dysku potrzebne do początkowego utworzenia archiwum.

Naftuli Kay
źródło
Powiązane pytanie: superuser.com/q/290986/11574
sampablokuper

Odpowiedzi:

108

Możesz potokować tar do polecenia split:

tar cvzf - dir/ | split --bytes=200MB - sda1.backup.tar.gz.

W niektórych systemach * nix (takich jak OS X) może pojawić się następujący błąd:

split: illegal option -- -

W takim przypadku spróbuj tego (zwróć uwagę na -b 200m):

tar cvzf - dir/ | split -b 200m - sda1.backup.tar.gz.

Jeśli próbujesz podzielić plik, aby zmieścił się na dysku sformatowanym w systemie FAT32, użyj limitu bajtów 4294967295. Na przykład:

tar cvzf - /Applications/Install\ macOS\ Sierra.app/ | \
split -b 4294967295 - /Volumes/UNTITLED/install_macos_sierra.tgz.
Jordan
źródło
3
Wspaniały! Jak mogę następnie wyodrębnić archiwum?
Naftuli Kay
24
Zrobi cat sda1.backup.tar.gz.* | tar xzvf -robotę?
Naftuli Kay
3
Tak, powinno. splitdomyślnie ustawia nazwy plików tak, aby po posortowaniu według LOCALE (co odbywa się poprzez globbing powłoki) były w odpowiedniej kolejności.
Jordan
4
Bez gadatliwości, po prostu obejdź się tar czf ...bez vi połącz cat backup.tar.gz.* | tar tar xzf - bez v. Nie widzę tu żadnej korzyści z pełnego tekstu wyjściowego v.
Léo Léopold Hertz
1
Właśnie pomogłem przyjacielowi, pakując Xcode na sformatowany dysk flash FAT32 z: tar cvzf - Xcode.app/ | split -b 2000m - /Volumes/PH/xcode/xcode.tgz(używane z cd /Applications/) Dziękuję bardzo :)
ecth
13

W systemie macOS splitpolecenie działa nieco inaczej:

$ tar cvzf - foo | split -b 2500m - foo.tgz.
Erik Allik
źródło
4

Wystarczy dodać: Ponieważ maksymalny dozwolony rozmiar pliku w vfat / fat32 wynosi 2 ^ 32 minus 1 (4294967295 bajtów), polecenie split z maksymalnym dozwolonym rozmiarem pliku w takim systemie plików to:

split -b4294967295 -d my_input_file my_output_file_splitted
Aydin K.
źródło
3
serega@serega-sv:~$ tar -c  -M --tape-length=1024 --file /tmp/pseudo-tape.tar --new-volume-script=/tmp/new-volume.sh --volno-file=/tmp/volno /tmp/stuff-to-archive 
tar: Removing leading `/' from member names
moving /tmp/pseudo-tape.tar to /tmp/archive.1
moving /tmp/pseudo-tape.tar to /tmp/archive.2
moving /tmp/pseudo-tape.tar to /tmp/archive.3

Będziesz potrzebował skryptu do automatyzacji przenoszącego plik pseudo-tape.tar do nowej nazwy:

serega@serega-sv:~$ cat /tmp/new-volume.sh 
dir="/tmp"
base_name="pseudo-tape.tar"
next_volume_name=`echo -n "archive."; cat $dir/volno`
echo "moving $dir/$base_name to $dir/$next_volume_name"
mv "$dir/$base_name" "$dir/$next_volume_name"
Siergiej Romanowski
źródło
Nie doceniłem twojej odpowiedzi, ponieważ cieszę się, że korzystam z niej -M --tape-length. Jednak ta odpowiedź ignoruje żądanie OP dotyczące rozwiązania wykorzystującego kompresję gzip lub bzip2.
sampablokuper
Uwaga: nie mówisz o tarklonie tar zwanym gtar(GNU tar). Ten klon tar obsługuje tworzenie archiwów o wielu woluminach, ale z zauważalnym prawdopodobieństwem nie jest w stanie / nie chce wyodrębnić z tych archiwów o wielu woluminach, ponieważ błędnie twierdzi, że wolumin uzupełniający nie jest właściwą częścią kontynuacji.
schily