find . -type f -not \( -name '*.gz' -or -name '*[~#]' \) -exec sh -c 'gzip -c "{}" > "{}.gz"' \;
Вы можете легко переключать его, чтобы включить то, что вы хотите сжать ( -name '*.txt -or -name '*.html
и т.д.), А не как сейчас, за исключением некоторых файлов (уже сжатых, резервных и временных файлов).
Обрабатывает пробелы в имени файла тоже очень хорошо.
Замените gzip
на echo gzip
для тестирования. Или пропустите часть -exec все вместе.
Изменить: О, я забыл упомянуть, что это не проверяет, если <target>.gz
уже существует. Это может или не может быть проблемой.
Edit2: Хорошо, здесь мы идем с чем-то, что проверяет существующий файл. Если это может быть желательно. Прошу прощения за единственность.
while read file; do if [ ! -f "$file.gz" ]; then echo "Compressing $file"; gzip -c "$file" > "$file.gz"; else echo "Not overwriting $file.gz"; fi done < <(find . -type f -not \( -name '*.gz' -or -name '*[~#]' \))
Возможно, моя find
-foo совсем не та, что может быть, вполне возможно пропустить поиск напрямую.