Pytanie w sprawie bash, shell, gzip, linux, loops – Jak zgrać wszystkie pliki we wszystkich podkatalogach w bashu

20

Chcę iterować między podkatalogami mojej bieżącej lokalizacji i gzipować każdy plik osobno. Do kompresowania plików w katalogu używam

<code>for file in *; do gzip "$file"; done
</code>

ale może to działać tylko w bieżącym katalogu, a nie w podkatalogach bieżącego katalogu. W jaki sposób mogę przepisać powyższe instrukcje, tak aby również rozpakowywała pliki we wszystkich podkatalogach?

Twoja odpowiedź

3   odpowiedź
27

gzip -r ./ co robi to samo, ale jest krótsze.

Czy nie powinna to być najlepsza odpowiedź ...? GyuHyeon Choi
50

Nie potrzeba pętli ani nic więcejfind igzip:

<code>find . -type f ! -name '*.gz' -exec gzip "{}" \;
</code>

Znajduje to wszystkie zwykłe pliki w bieżącym katalogu i pod nim, których nazwy nie kończą się na.gz rozszerzenie (czyli wszystkie pliki, które nie są jeszcze skompresowane). Przywołujegzip na każdym pliku indywidualnie.

Edytuj na podstawie komentarza zuser unknown:

Nawiasy klamrowe ({}) są zastępowane nazwą pliku, która jest przekazywana bezpośrednio jako pojedyncze słowo do następującego polecenia-exec jak widać tutaj:

<code>$ touch foo
$ touch "bar baz"
$ touch xyzzy
$ find . -exec echo {} \;

./foo
./bar baz
./xyzzy
</code>
+1 dla wykluczenia plików * .gz GuruM
Każdego dnia uczysz się czegoś nowego. Dzięki za lekcję! Adam Liss
Twoje ostatnie zdanie to powszechna dezinformacja. Znajdź wie, gdzie rozpoczyna się nazwa pliku i gdzie się kończy. Sam nie ma żadnych problemów ze spacjami, łamaniem linii i innymi zabawnymi rzeczami. Tak więc `-exec gzip {}` wywołuje gzip z pojedynczą nazwą pliku, a ponieważ nie jest wywoływana żadna powłoka pośrednia, która mogłaby zinterpretować pusty jako separator, gzip otrzyma całą nazwę pliku. Wskazówka w podręczniku find wydaje się przestarzała i oznacza: Twoja powłoka może próbować interpretować {} przed przekazaniem jej w celu znalezienia, ale nie widziano takiej powłokiprzez lata. user unknown
5
<code>find . -type f | while read file; do gzip "$file"; done
</code>
imo, odpowiedź jest błędna. Farshid nigdy nie określił, że pliki nie zawierają znaków specjalnych, więc twoja odpowiedź odpowiada tylko na specjalny przypadek pytania. Lepiej z tego korzystaszfind .. | while read ... Popraw swoją odpowiedź, a ja będę pierwszy na głos. Ale nie proś mnie o promowanie nieprawidłowych (imo) odpowiedzi. c00kiemon5ter
@ c00kiemon5ter Czy odpowiedź, która działa, ale może być niekompletna, zasługuje na downvote? Według SO „Korzystaj ze swoich downvotes, gdy napotykasz skandalicznie niechlujny, bez wysiłku wydany post lub odpowiedź, która jest wyraźnie i być może niebezpiecznie niepoprawna”. Ta odpowiedź nie jest żadną z tych rzeczy. Niekompletne, nieco niechlujne, ale niepoprawne. Prawdopodobnie powinieneś pozwolić, aby proces upvote zbierał swoje żniwo i zostawił komentarz. Tim Pote
Ponieważ twoja odpowiedź była bardziej poprawna, a ty w niewytłumaczalny sposób ją odrzuciłeś, zmieniłem swoją odpowiedź na to, co było twoje. Po prostu zauważ, że „nie promowanie” niekoniecznie oznacza aktywną redukcję. Zmieniłbym moją odpowiedź lub ją usunąłbym po pańskim komentarzu. Tim Pote
co jeśli plik zawiera spacje lub inne specjalne znaki? to nie będzie działaćfor tam c00kiemon5ter

Powiązane pytania