Użyj gzip do skompresowania plików w katalogu, z wyjątkiem już istniejących plików .gz


19

Mam katalog dzienników, w których chciałbym skonfigurować zadanie do kompresji za pomocą gzip . Problem polega na tym, że nie chcę ponownie kompresować dzienników, które już skompresowałem.

Próbowałem użyć ls | grep -v gz | gzip, ale to nie działa.

Czy jest na to sposób? Zasadniczo chcę zgzipować każdy plik w katalogu, który nie kończy się na .gz.

Odpowiedzi:


26

Możesz po prostu zrobić:

gzip *

gzip powie ci, że pomija pliki, które już mają .gz zakończenie.
Jeśli ten komunikat przeszkadza, możesz użyć:

gzip -q *

To, co próbowałeś, nie zadziałało, ponieważ gzipnie odczytuje nazw plików do skompresowania ze standardowego wejścia, aby to zadziałało, musisz użyć:

ls | grep -v gz | xargs gzip

Wykluczysz pliki ze wzorcem w gzdowolnym miejscu w nazwie pliku, nie tylko na końcu .¹ Trzeba także pamiętać, że analizowanie wyniku lsjest niebezpieczne, jeśli masz nazwy plików ze spacjami, znakami nowej linii itp.

Bardziej czystym rozwiązaniem, nie polegającym na gzippomijaniu plików z .gzzakończeniem, jest także obsługa plików nieskompresowanych w podkatalogach:

find .  -type f ! -name "*.gz" -exec gzip {} \;



¹ Jak izkataskomentowano: użycie .gzsamego w celu poprawy tego nie zadziałałoby. Musisz użyć grep -vF .gzlubgrep -v '\.gz$' . Nadal pozostawia to niebezpieczeństwo przetwarzania lsprodukcji


1
„... dzięki temu mniej prawdopodobne jest dopasowanie jakiejś wewnętrznej części nazwy pliku” - to grep, po prostu użyj, $aby było wyraźniejsze. I tak nie .uciekłeś, więc będzie to wykluczać tylko te pliki, które zaczynają się gzod (ponieważ nie mają wcześniej „żadnej postaci gz”)
Izkata,

1
@Izkata: Nie, łącznie z nieskalowaną kropką i niezakotwiczeniem wyrażenia regularnego z $wykluczeniem ( -v) wszystkich plików o nazwach składających się z trzech lub więcej znaków, w tym dowolnego znaku, po którym następuje „gz” w dowolnym miejscu w nazwie pliku. Będzie więc zawierać pliki o nazwach rozpoczynających się od „gz”.
Wstrzymano do odwołania.

1
@DennisWilliamson Mój ostatni komentarz nie był jasny, wykluczy również pliki z gzdowolnym miejscem w nazwie (oprócz początku). Więc i tak lepiej to zakotwiczyć. Gdy nie używał $, czytał tak, jakbyś nie zdawał sobie sprawy, co .oznacza wyrażenie regularne, stąd reszta mylącego komentarza.
Izkata,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.