Skompresuj każdy plik w katalogu do własnego skompresowanego pliku

24

Jak skompresować każdy plik w katalogu do własnej tar, zachowując nazwę każdego pliku?

tzn. plik1.out plik2.out

->

plik1.out.tar.gz plik2.out.tar.gz

DD
źródło

Odpowiedzi:

64

Umieszczenie każdego pliku w osobnym pliku tar nie ma sensu w tym scenariuszu. Możesz użyć gzipich bezpośrednio do kompresji:

gzip *

spowoduje file1.out.gz, file2.out.gzetc.

Używałbyś tartylko wtedy, gdybyś potrzebował skompresowanego archiwum jako jednego pliku.

Jeśli potrzebujesz archiwum tar dla każdego pliku, możesz go utworzyć w następujący sposób:

for i in *; do tar -czf $i.tar.gz $i; done
Sven
źródło
7
+1 - Nie ma powodu, aby utworzyć tar (ARCHIWUM TAŚMY) dla pojedynczego pliku. Po prostu skompresuj to, co chcesz skompresować - wynik będzie nieznacznie mniejszy i będzie nieskończenie bardziej sensowny dla osób rozpakowywujących pliki.
voretaq7
Aby tarować poszczególne podkatalogi (tylko jeden poziom głębokości) i usunąć oryginał:find . -maxdepth 1 -type d ! -path . | while read a_dir; do tar -zcvf ${a_dir}.tgz ${a_dir} --remove-files; done
xb.
(nie mogę edytować mojego komentarza powyżej po 5 minutach) Prostsza / bezpieczniejsza wersja:find . -maxdepth 1 -mindepth 1 -type d -exec tar -zcvf {}.tgz {} --remove-files \;
xb.
9

Aby zbudować na podstawie odpowiedzi @ SvenW (która będzie działać tylko w bieżącym katalogu), jeśli masz ogromną liczbę plików lub chcesz to zrobić w strukturze katalogów rekurencyjnych, możesz również użyć

find . -type f -exec gzip \{\} \;

a jeśli chcesz umieścić dane wyjściowe w innym katalogu (w tym przykładzie ../target) i nie chcesz usuwać oryginałów, możesz zrobić coś takiego:

find . -type f -print | while read fname ; do
    mkdir -p "../target/`dirname \"$fname\"`"
    gzip -c "$fname" > "../target/$fname.gz"
done
puszysty
źródło
1
find . -type f -exec gzip {} \;będzie wystarczające. Drugi kod zawiedzie w przypadku nazw plików zawierających spacje i tym podobne.
użytkownik nieznany
Niektóre muszle nie lubią gołych {}, a druga robi coś wyraźnie odmiennego od pierwszego (i zdawałem sobie sprawę z problemów z odstępami, ale jest to dość trudne do rozwiązania).
puszysty
Jeśli znasz taką skorupę, zapraszam odpowiedzieć na moje pytanie tutaj: unix.stackexchange.com/questions/8647/... . Dotychczas nikt nie był w stanie wymienić czegoś, co jest dziś w użyciu. Jeśli zdajesz sobie sprawę z ryzyka swojej odpowiedzi, dobrym pomysłem może być podanie jej w swojej odpowiedzi.
użytkownik nieznany
@userunknown Wychowałem się na (t) csh, który miał kiedyś sporo kłopotów z nieokreślonymi kręconymi nawiasami klamrowymi, chociaż nie wydaje się to już więcej (ale wciąż uciekam {}jako siła przyzwyczajenia). Inni opublikowali je jednak jako odpowiedzi na twoje pytanie.
puszysty
Lub, aby skompresować wszystkie pliki niebinarne:find . -type f -exec grep -Iq . {} \; -and -exec gzip {} \;
xb.
0

Spróbuj tego:

#!/bin/bash
for fich in *; do
    if [ "$fich" != "*" ] ; then
        gzip -9 -c $fich > $fich.tar.gz
        \mv $fich.tar.gz $fich
    fi
done
Maty
źródło