我需要单独对目录中的所有文件(包括子目录中的所有文件)进行 gzip 压缩,之后不删除原始文件。假设我有 index.html,我希望在末尾有 index.html.gzip 和 index.html。
我可以通过以下方式对目录中的所有文件进行 gzip 压缩
gzip -r .
但我也想保留原始文件。
这可能吗?
答案1
find . -type f | \
while read -r x
do
gzip -c "$x" > "$x.gz"
done
将-c
结果推送到 stdout 并保留原始文件。缺点是,您需要自己查找文件。find(1)
但是,对于更复杂的遍历,您可以使用,如上所示:.
从当前目录开始搜索,并-type f
返回每个常规文件的名称。
答案2
find . -type f -not \( -name '*.gz' -or -name '*[~#]' \) -exec sh -c 'gzip -c "{}" > "{}.gz"' \;
您可以轻松地将其切换为包含您想要压缩的内容(-name '*.txt -or -name '*.html
等等),而不是像现在这样排除某些文件(已压缩、备份和临时文件)。
也能很好地处理文件名中的空格。
更改gzip
为 echo gzip
进行测试。或者完全跳过 -exec 部分。
编辑:哦,我忘了说了,这并不检查是否<target>.gz
已经存在。这可能是个问题,也可能不是。
编辑2:好的,我们开始检查是否存在文件。如果需要的话。请原谅我的一行。
while read file; do if [ ! -f "$file.gz" ]; then echo "Compressing $file"; gzip -c "$file" > "$file.gz"; else echo "Not overwriting $file.gz"; fi done < <(find . -type f -not \( -name '*.gz' -or -name '*[~#]' \))
我的find
-foo 可能不是它本来的样子,很可能直接在 find 中跳过。
答案3
gzip-k
选项
gzip 1.6(2013 年 6 月)添加了该-k, --keep
选项,因此现在您可以:
gzip -kr .
并且它不会删除您的原始文件。
发现于:https://unix.stackexchange.com/questions/46786/how-to-tell-gzip-to-keep-original-file
答案4
gzip -rc `ls` > archive.gz
在 Debian 上测试(gzip 1.3.12-6)