Используйте gzip для сжатия файлов в каталоге, за исключением уже существующих .gz файлов

19

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

Я пытался использовать ls | grep -v gz | gzip, но это не похоже на работу.

Есть ли способ сделать это? В основном я хочу сжать каждый файл в каталоге, который не заканчивается на .gz.

jabbajac
источник

Ответы:

26

Вы можете просто сделать:

gzip *

gzip скажет вам, что пропускает файлы, которые уже имеют .gz окончание.
Если это сообщение мешает, вы можете использовать:

gzip -q *

То, что вы пробовали, не сработало, потому gzipчто не читает имена файлов для сжатия из stdin, чтобы это работало, вы должны использовать:

ls | grep -v gz | xargs gzip

Вы будете исключать файлы с шаблоном в gzлюбом месте имени файла, а не только в его конце. Вы также должны принять к сведению, что анализ выходных данных lsопасен, если у вас есть имена файлов с пробелами, символами новой строки и т. Д.

Более чистое решение, не основанное на gzipпропуске файлов с .gzокончанием, - это также обработка несжатых файлов в подкаталогах:

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



¹ Как izkataпрокомментировано: использование в .gzодиночку, чтобы улучшить это, не будет работать. Вам нужно будет использовать grep -vF .gzили grep -v '\.gz$'. Это все еще оставляет опасность обработки lsпродукции

Энтон
источник
1
«... это снижает вероятность совпадения с какой-либо внутренней частью имени файла» - это grep, просто используйте, $чтобы было понятнее. И вы все равно не избежали ., так что это будет исключать только файлы, которые начинаются с gz(так как у них нет «ранее ни одного символа gz»)
Izkata
1
@Izkata: Нет, включая неэкранированную точку и отсутствие привязки регулярного выражения при $переходе к exclude ( -v) для всех файлов, имена которых состоят из трех или более символов, включая любой символ, за которым следует «gz» в любом месте имени файла. Поэтому он будет включать файлы с именами, которые начинаются с "gz".
Приостановлено до дальнейшего уведомления.
1
@DennisWilliamson Мой последний комментарий не был ясен, он также исключает файлы с gzлюбым именем в названии (кроме начала). Так что лучше все равно закрепить. Не использовав $, выглядело так, как будто вы не поняли, что .означает регулярное выражение, отсюда и остальная часть запутанного комментария.
Изката