Назад | Перейти на главную страницу

BASH / Linux - требуется команда для рекурсивного сжатия файла определенного типа в многоуровневом каталоге.

Мне нужно сжать значительное количество файлов pdf и txt, но я хочу оставить файловую структуру нетронутой. В каталогах есть много-много подкаталогов.

Когда я хочу сжать файлы определенного типа в одном каталоге, я запускаю:

for i in `find | grep -E "\.pdf$|\.txt$"`; do gzip "$i" ; done

но на это у меня ушли бы годы.

Попробуйте это в каталоге верхнего уровня.

find . -type f -mmin +1 '(' -iname '*.txt' -o -iname '*.pdf' ')' -exec gzip {} ';'

Я взял на себя смелость использовать gzip только файлы старше 2 минут, чтобы он не касался файлов, которые, вероятно, в настоящее время будут записаны в (mmin +1 делает это).

Я не уверен, почему ваша существующая «команда» не работает. Однако этот сценарий должен. Запускаем в родительском каталоге.

#!/bin/bash

find . -type f| while read FILE
do
  if grep -E "\.pdf$|\.txt$"; then
    gzip ${FILE}
  fi
done