我需要单独将目录中的所有文件gzip压缩,包括子目录中的所有文件,而之后不删除原始文件。假设我有index.html,最后我想拥有index.html.gzip和index.html。
我可以通过以下方式将目录中的所有文件gzip压缩
gzip -r .
但是我也想保留原始文件。
这可能吗?
我需要单独将目录中的所有文件gzip压缩,包括子目录中的所有文件,而之后不删除原始文件。假设我有index.html,最后我想拥有index.html.gzip和index.html。
我可以通过以下方式将目录中的所有文件gzip压缩
gzip -r .
但是我也想保留原始文件。
这可能吗?
Answers:
find . -type f | \
while read -r x
do
gzip -c "$x" > "$x.gz"
done
该-c
推结果到stdout,并保持原来的孤单。缺点是,您需要自己查找文件。对于更复杂的遍历,可以find(1)
像上面一样使用,.
从当前目录开始搜索,并-type f
返回每个常规文件的名称。
*.*
匹配所有常规命名的文件,通常没有目录。当然,它仅在大多数情况下有效,通常在您不需要时无效。然后使用find
命令。
ls
不需要在所有:for x in *
。但是,find
应使用find . -type f | while read -r x
。
-r
开启read
。
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
已经存在。这可能是问题,也可能不是问题。
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中跳过。
gzip 1.6(2013年6月)添加了该-k, --keep
选项,因此您现在可以:
gzip -kr .
可以在以下网址找到:https : //unix.stackexchange.com/questions/46786/how-to-tell-gzip-to-keep-original-file
*.*
在ls
?