使用 /bin/gzip 以特定模式压缩文件

使用 /bin/gzip 以特定模式压缩文件

我想用特定的模式单独压缩文件。例如,我有如下目录:

/log/log1
    -/1/log2/file.1
    -/1/log2/file123
    -/1/log2/file2.1
/log/log2
    -/2/log2/file4.1
    -/2/log2/file345
    -/2/log2/file3.1

我想递归地压缩 /log 内所有扩展名为 .1 的文件。

结果看起来像

/log/log1
    -/1/log2/file.gz
    -/1/log2/file123
    -/1/log2/file2.gz
/log/log2
    -/2/log2/file4.gz
    -/2/log2/file345
    -/2/log2/file3.gz

答案1

find+bash解决方案:

find /log -type f -name "*.1" -exec bash -c 'gzip -nc "$1" > "${1:0:-2}.gz"; rm "$1"' _ {} \;

gzip选项:

  • -n- 压缩时,默认不保存原始文件名和时间戳
  • -c- 将输出写入标准输出;保持原始文件不变

${1:0:-2}-bash切片;获取最后 2 个字符被截断的文件路径

答案2

你可以这样做:

find /log -name '*.1' -type f -exec sh -c '
  for file do
    gzip "$file" && mv -i "$file.gz" "${file%.*}.gz"
  done' sh {} +

我们使用gzip file && mv -i file.gz newfile与 相对,是gzip < file > newfile && rm -f file为了受益于gzip将某些元数据保留到压缩文件中的能力以及mv -i更好的处理冲突的能力。

相关内容