Если вы не знать точное имя файла, вы можете сделать что-то вроде этого:
find /users/tnea01 -maxdepth 1 -name '*.log' -type f -exec sh -c \
'for f; do
gzip -c <"$f" >"https://stackoverflow.com/users/tnea01/logfile_archive/${f##*/}_$(date -r "$f" +%F).gz"
done' _ {} +
Объяснение движущихся частей:
- Единственный безопасный способ использования
sh -c
- с полностью постоянной строкой; подстановка в него переменных (включая имена файлов) создает уязвимости безопасности. Таким образом, мы не используем какое-либо средство замены в коде, но передаем имя файла (ов) в качестве дополнительных аргументов.
for f; do
- это то же самое, что и for f in "[email protected]"; do
- он выполняет итерацию по всем аргументам командной строки.
${f**#/}
оценивает все после последнего /
в $f
; см. the bash-hackers page on parameter expansion.
- Различия, включая
$(date ...)
, должны быть в контексте с двойными кавычками, чтобы быть в безопасности; здесь мы помещаем полное имя файла назначения в такие кавычки.
Однако, так как вы делаете, это все совершенно излишни.
f=/users/tnea01/logfile10.log
d=/users/tnea01/logfile_archive
gzip -c <"$f" >"$d/${f##*/}_$(date -r "$f" +%F).gz"
Какая ошибка возникает у вас? – DaBler
Вы находите командную работу без команды exec? –
Здесь нет ошибки я получаю: GZIP: /users/tnea01/logfile10.tar.gz: Нет такого файла или каталога GZIP: /users/tnea01/logfile10.log: неизвестный суффикс - игнорируется – connollyc4