Как сжать файл
Как я могу сжать этот файл? Я получаю ошибку:
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"