Використовуйте gzip для стиснення файлів у каталозі, за винятком вже існуючих .gz файлів


19

У мене є каталог журналів, в якому я хотів би налаштувати завдання на стиснення за допомогою gzip . Проблема полягає в тому, що я не хочу повторно стискати журнали, які я вже стиснув.

Я спробував використовувати ls | grep -v gz | gzip, але це, здається, не працює.

Чи є спосіб це зробити? В основному я хочу gzip кожен файл у каталозі, який не закінчується .gz.

Відповіді:


26

Ви можете просто зробити:

gzip *

gzip скаже вам, що він пропускає файли, які вже мають .gz закінчення.
Якщо це повідомлення стає таким, яким ви можете скористатися:

gzip -q *

Те, що ви спробували, не вийшло, оскільки gzipне читає назви файлів для стиснення зі stdin, для цього вам доведеться використовувати:

ls | grep -v gz | xargs gzip

Ви будете виключати файли з шаблоном в gzбудь-якому місці імені файлу, а не лише в кінці. Also Також ви повинні взяти до уваги, що синтаксичний аналіз виводу з lsфайлів небезпечний, якщо у вас є назви файлів з пробілами, новинками тощо.

Більш чисте рішення, не покладаючись на gzipпропуск файлів із .gzзакінченням, також обробляє нестиснені файли у підкаталогах:

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



¹ Як izkataпрокоментував: використовуючи .gzодин , щоб поліпшити це, не буде працювати. Вам потрібно буде використовувати grep -vF .gzабо grep -v '\.gz$'. Це все ще залишає небезпеку обробки lsвиходу


1
"... що робить меншою ймовірність відповідності якійсь внутрішній частині імені файлу" - це grep, просто використовуйте, $щоб було зрозуміліше. І ви все .одно не уникнули , тому лише gzgz
вилучіть

1
@Izkata: Ні, включаючи незмінену крапку і не закріплюючи регулярний вираз, $виключаючи ( -v) всі файли, які мають імена, що складаються з трьох і більше символів, включаючи будь-який символ, за яким "gz" в будь-якому місці імені файлу. Тож він буде включати файли з іменами, які починаються з "gz".
Призупинено до подальшого повідомлення.

1
@DennisWilliamson Мій останній коментар не був зрозумілим, він також буде виключати файли з gzбудь-якого місця в назві (крім початку). Тому краще все-таки прив’язати його. Не використовуючи $, він читав так, ніби ви не зрозуміли, що .означає підсумок, звідси і решта заплутаного коментаря.
Ізката
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.