![使用 /bin/gzip 以特定模式压缩文件](https://linux22.com/image/131610/%E4%BD%BF%E7%94%A8%20%2Fbin%2Fgzip%20%E4%BB%A5%E7%89%B9%E5%AE%9A%E6%A8%A1%E5%BC%8F%E5%8E%8B%E7%BC%A9%E6%96%87%E4%BB%B6.png)
我想用特定的模式单独压缩文件。例如,我有如下目录:
/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
更好的处理冲突的能力。