如何gzip这个文件?我收到一个错误:
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:未知后缀 - 忽略
答案 0 :(得分: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
之后的所有内容;见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"