gzip所有文件而不删除它们


11

我需要单独将目录中的所有文件gzip压缩,包括子目录中的所有文件,而之后不删除原始文件。假设我有index.html,最后我想拥有index.html.gzip和index.html。

我可以通过以下方式将目录中的所有文件gzip压缩

gzip -r .

但是我也想保留原始文件。

这可能吗?

Answers:


9
find . -type f | \
while read -r x
do
  gzip -c "$x" > "$x.gz"
done

-c推结果到stdout,并保持原来的孤单。缺点是,您需要自己查找文件。对于更复杂的遍历,可以find(1)像上面一样使用,.从当前目录开始搜索,并-type f返回每个常规文件的名称。


为什么*.*ls

@pooh:*.*匹配所有常规命名的文件,通常没有目录。当然,它仅在大多数情况下有效,通常在您不需要时无效。然后使用find命令。
Boldewyn

@Boldewyn:问题是将所有文件gzip压缩到目录中。ls *.*不会选择TODO之类的文件。

ls不需要在所有for x in *。但是,find应使用find . -type f | while read -r x
暂停,直到另行通知。

更新的答案。感谢您的-r开启read
Boldewyn 2011年

5
find . -type f -not \( -name '*.gz' -or -name '*[~#]' \) -exec sh -c 'gzip -c "{}" > "{}.gz"' \;

您可以轻松地切换它,使其包含要压缩的内容(-name '*.txt -or -name '*.html等),而不是像现在这样,排除一些文件(已压缩,备份和临时文件)。

处理文件名中的空格也很好。

更改gzipecho gzip进行测试。或一起跳过-exec部分。

编辑:哦,我忘了提到这不检查是否<target>.gz已经存在。这可能是问题,也可能不是问题。

Edit2:好的,接下来我们要检查现有文件。如果可能需要。请原谅。

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中跳过。


1
只需阅读-name应该在-type之前,以避免在每个文件上调用stat。

@Ben有道理,很好的输入!对于大树,这可能会很明显。
plundra



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.