如何gzip文件

时间:2016-07-28 22:10:05

标签: linux shell gzip gunzip

如何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:未知后缀 - 忽略

1 个答案:

答案 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; dofor 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"