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
Umieszczenie każdego pliku w osobnym pliku tar nie ma sensu w tym scenariuszu. Możesz użyć gzip
ich bezpośrednio do kompresji:
gzip *
spowoduje file1.out.gz
, file2.out.gz
etc.
Używałbyś tar
tylko 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
find . -maxdepth 1 -type d ! -path . | while read a_dir; do tar -zcvf ${a_dir}.tgz ${a_dir} --remove-files; done
find . -maxdepth 1 -mindepth 1 -type d -exec tar -zcvf {}.tgz {} --remove-files \;
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ć
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:źródło
find . -type f -exec gzip {} \;
będzie wystarczające. Drugi kod zawiedzie w przypadku nazw plików zawierających spacje i tym podobne.{}
jako siła przyzwyczajenia). Inni opublikowali je jednak jako odpowiedzi na twoje pytanie.find . -type f -exec grep -Iq . {} \; -and -exec gzip {} \;
Spróbuj tego:
źródło