Как сжать файл

Как я могу сжать этот файл? Я получаю ошибку:

find /users/tnea01/logfile10.log -type f -exec sh -c \ 'gunzip /users/tnea01/logfile_archive/$(basename $0)_$(date -r {} +%F).gz $0' {} \;

Вот ошибка, которую я получаю:

gzip: /users/tnea01/logfile10.tar.gz: нет такого файла или каталога gzip: /users/tnea01/logfile10.log: неизвестный суффикс - игнорируется

1 ответ

Если вы не знаете точное имя файла, вы можете сделать что-то вроде этого:

find /users/tnea01 -maxdepth 1 -name '*.log' -type f -exec sh -c \
    'for f; do
       gzip -c <"$f" >"/users/tnea01/logfile_archive/${f##*/}_$(date -r "$f" +%F).gz"
     done' _ {} +

Чтобы объяснить движущиеся части:

  • Единственный безопасный способ использования sh -c с полностью постоянной строкой; подстановка переменных в него (включая имена файлов) создает уязвимости безопасности. Таким образом, мы не используем никаких средств замены в коде, но передаем имя файла (ов) в качестве дополнительных аргументов.
  • for f; do такой же как for f in "$@"; do - он перебирает все аргументы командной строки.
  • ${f**#/} оценивает все после последнего / в $f; см. страницу bash-hackers по расширению параметров.
  • Расширения, в том числе $(date ...)должны быть в двойных кавычках, чтобы быть в безопасности; здесь мы помещаем все имя файла назначения в такие кавычки.

Однако, так как вы делаете, это все совершенно ненужно.

f=/users/tnea01/logfile10.log
d=/users/tnea01/logfile_archive
gzip -c <"$f" >"$d/${f##*/}_$(date -r "$f" +%F).gz"
Другие вопросы по тегам