2

У меня много текстовых файлов, которые я хочу сжать. Каждый файл должен быть сжат отдельно. Но некоторые из них уже сжаты.

Как мне сжать в одну строку все файлы, оканчивающиеся на .txt , добавив .zip к их имени?

Я знаю в Баше, что могу, но не знаю как.

  • find /path/to/files -name "*.txt" перечислит мне эти файлы
  • zip fname.txt.zip fname.txt файл
  • rm fname.txt удалит оригинальный файл

Как мне передать их в одну строку? Я плохо понимаю xargs которые часто вижу в этих случаях.

2 ответа2

3

Хотя это может быть сделано с помощью конвейерной команды, find может сделать это самостоятельно:

find /path/to/files -name '*.txt' -exec zip '{}.zip' '{}' ';' -exec rm '{}' ';'

Как вы можете догадаться, -exec запускает команду, оканчивающуюся точкой с запятой (которая скрыта от оболочки с помощью кавычек или обратной косой черты), а {} означает имя текущего найденного и обработанного файла (а также скрытого от оболочки).

0

Сделал вдох и ... две команды

  • find . | grep -i '\.txt$' | xargs -I {} zip {}.zip {}
  • find . | grep -i '\.txt$' | xargs -I {} rm {}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .