如果您不知道确切的文件名,您可能会执行以下操作:
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**#/}
计算最后一个/
in之后的所有内容$f
;请参阅参数扩展的 bash-hackers 页面。
- 为了安全起见,包括 在内的扩展
$(date ...)
需要在双引号上下文中;在这里,我们将整个目标文件名放在这样的引号中。
但是,既然你这样做了,那就完全没必要了。
f=/users/tnea01/logfile10.log
d=/users/tnea01/logfile_archive
gzip -c <"$f" >"$d/${f##*/}_$(date -r "$f" +%F).gz"