Jestem na Ubuntu 16.04.
Mam folder z dużą ilością plików tekstowych (prawie 12 KB). Muszę przesłać je wszystkie na stronę internetową, która akceptuje .tar.gz
przesyłanie, a następnie automatycznie je dekompresuje, ale ma limit 10 MB (10000 KB) na plik (w szczególności każdy plik musi zostać zdekompresowany osobno). Jeśli tar.gz
wszystkie te pliki, plik wynikowy ma około 72 MB.
Chciałbym utworzyć osiem .tar.gz
plików, każdy o rozmiarze / wymiarze (ściśle) mniejszym niż 10000 KB.
Alternatywnie można założyć, że wszystkie powyższe pliki mają w przybliżeniu ten sam wymiar, dlatego chciałbym utworzyć osiem .tar.gz
plików z mniej więcej taką samą ilością plików.
Jak mogę wykonać którekolwiek z tych dwóch zadań?
Nie mam nic przeciwko rozwiązaniu, które obejmuje GUI, CLI lub skrypty. Nie szukam tutaj prędkości, po prostu muszę to zrobić.
źródło
tar
je dodać, dodając wszystkie pliki, zaczynając od określonego wzorca, aż uzyskasz je wszystkie. Można to łatwo skrypty, ale nie gwarantuje, że rozmiar będzie mniejszy niż 9 MB, jak potrzebujesz. Można jednak ręcznie dostosować rozmiar tych plików, które są zbyt duże, dzieląc je dalej.Odpowiedzi:
Całkowicie patchwork i szybki, szorstki szkic, ale testowany w katalogu z 3000 plików, poniższy skrypt wykonał niezwykle szybką pracę:
Jak używać
compress_split.py
Uruchom go z katalogiem z plikami jako argumentem:
.tar.gz
pliki ponumerowane zostaną utworzone w tym samym katalogu, w którym znajdują się pliki.Wyjaśnienie
Scenariusz:
EDYTOWAĆ
Automatycznie twórz porcje według rozmiaru w MB
Bardziej wyrafinowane jest użycie maksymalnego rozmiaru (w mb) porcji jako (drugiego) argumentu. W skrypcie poniżej fragmenty są zapisywane w skompresowanym pliku, gdy tylko fragment osiągnie (przekroczy) próg.
Ponieważ skrypt jest uruchamiany przez porcje, przekraczając próg, zadziała to tylko wtedy, gdy rozmiar (wszystkich) plików jest znacznie mniejszy niż porcja.
Scenariusz:
Biegać:
... gdzie chunksize to rozmiar danych wejściowych dla polecenia tar.
W tym zawarte są sugerowane ulepszenia @DavidFoerster. Dzięki dużo !
źródło
tar
wywołanie, podając listę plików w standardowym strumieniu wejściowym.tar
pozwala określić pliki do dodania (lub wyodrębnienia) na standardowym wejściu z odpowiednią opcją.Podejście oparte na czystej powłoce:
Wyjaśnienie
files=(*)
: zapisz listę plików (także katalogi, jeśli są obecne, zmień,files=(*.txt)
aby uzyskać tylko rzeczy ztxt
rozszerzeniem) w tablicy$files
.num=$((${#files[@]}/8));
:${#files[@]}
to liczba elementów w tablicy$files
. Jest$(( ))
to (ograniczony) sposób wykonywania arytmetyki przez bash. To polecenie ustawia$num
liczbę plików podzieloną przez 8.k=1
: tylko licznik do nazwania tarballów.for ((i=0; i<${#files[@]}; i+=$num)); do
: iteruj po wartościach tablicy.$i
jest inicjowany o0
(pierwszy element tablicy) i zwiększany o$num
. Trwa to, dopóki nie przejdziemy przez wszystkie elementy (pliki).tar cvzf files$i.tgz -- ${files[@]:$i:$num}
: w bash można uzyskać plasterek tablicy (część tablicy) za pomocą${array[@]:start:length}
, więc${array[@]:2:3}
zwróci trzy elementy, zaczynając od drugiego. Tutaj bierzemy wycinek, który zaczyna się od bieżącej wartości$i
i ma$num
długość elementów. Jest--
to konieczne, jeśli dowolna z nazw plików może zaczynać się od-
.((k++))
: przyrost$k
źródło