[ Linux ] tar 打包解包都需要两倍空间,有什么办法可以解决吗

2020-07-14 21:48:22 +08:00
 mianhk

文件比较小的时候还比较好处理,但是文件大了,磁盘空间可能就不够了。

就解 tar 包而言,目前看到的比较流行的办法是:

1.找到 tar 中的一个个文件,解一个删一个。优点是在文件夹大小差不多时候,占用空间会小很多。缺点是,极慢
2.远程解包,然后 rsync 到目标机器。问题是还得专门搞一台机器。。

4948 次点击
所在节点    Linux
20 条回复
Osk
2020-07-14 22:01:21 +08:00
换 7z ?
Jirajine
2020-07-14 22:03:29 +08:00
管道
cev2
2020-07-14 22:17:20 +08:00
1.打包+压缩不需要两倍空间;
2.tar 可直接挂载,不需要解包。
dangyuluo
2020-07-14 22:28:26 +08:00
pipe
codehz
2020-07-14 22:43:50 +08:00
https://unix.stackexchange.com/questions/341458/decompress-gzip-file-in-place
按这个方法解压应该可以(改 unzip 为 tar xvf 附带压缩参数)
压缩大概也可以,但是不确定能不能用 shell 实现
laminux29
2020-07-14 23:18:57 +08:00
这根本就不是技术问题,建议楼主学一点服务器管理以及运维知识。

你这个问题类似于,在公共场所大小便怎样才能不被打。

答案并不是找出不被打的办法,而是根本就不能在公共场所大小便。

还有个类似问题,tcp 怎样才能不粘包。
laqow
2020-07-15 00:51:49 +08:00
@laminux29 也有几十个 gz 打包成一个 tar 加起来几十 G 的场合吧
lozzow
2020-07-15 00:55:21 +08:00
@laminux29 没必要这样吧,我还是相信很多朋友都不知道这个情况吧,大家不一定有朋友你这样的高度,我反正还是挺期待有朋友能回答一下楼主的问题,然后学习一下🤓
shakoon
2020-07-15 08:30:01 +08:00
楼主可能还没有搞明白,tar 是没有压缩的,只是物理上把文件放到一起,和 zip/rar/7z/gz 之类的完全是两回事,所以才会用到你说的“两倍”空间
amrom
2020-07-15 09:03:10 +08:00
我可以想到的方法,先创建一个 tar,包再往里面添加,添加一个删除一个,管道符配合使用,添加一个删除一个
amrom
2020-07-15 09:40:11 +08:00
```shell
tar -cvf tmp.tar b.txt
for file in `find 2020`
do
echo $file
tar -uvf tmp.tar $file
rm -rf $file
done
```

## 1. 创建 tmp.tar 文件
## 2. 遍历需要打包的文件,追加到 tar 包内
## 3. 删除已经追加的
lolizeppelin
2020-07-15 09:46:33 +08:00
可以看下 coreutils 里 split 的的代码
如果也是复制, 那应该没有一般性的做法能做到
mianhk
2020-07-15 09:52:05 +08:00
@Osk #1 已经用了没办法改了
@Jirajine #2 单纯只是解 tar 包的话,解完前后,原 tar 包和解开的文件都在,肯定还是两倍空间了。。
@cev2 #3 1.只打包和解包的话是会的,原文件和新文件夹 加在一起。2.直接挂载想写文件进 tar 包可以直接操作吗,是不是也慢一些
@codehz #5 粗略看了一下,这个回答好像本身就不建议用。。

@laminux29 #6 现在问题是,我有个朋友已经公共场合大小便了,可以怎么处理让他不被打吗
@shakoon #9 就是知道了这一点,所以才想要有没有什么好的办法,最前面说到的两个是可以保证一倍空间的,但是都还是有劣势
@linjinbao66 #10 同第一种方式,这个过程耗时太长了
Latin
2020-07-15 10:48:31 +08:00
tar -czvf
-z 添加 gzip 压缩
Jirajine
2020-07-15 10:50:49 +08:00
@mianhk 比如你的 tarball 是从网络下载,
wget -O - xxx.tar.gz | tar xz -f -
就可以只占用一份空间了。
mianhk
2020-07-15 13:49:20 +08:00
@Jirajine #15 不是网络下载的。。
@lolizeppelin #12 可能只有开始说的第二种算是比较好的了
ETiV
2020-07-15 14:33:59 +08:00
「磁盘空间可能就不够了」
不能加吗,或者 NFS 挂载一个远程的磁盘

https://en.wikipedia.org/wiki/Tar_(computing)

tar ... The name is derived from "tape archive", as it was originally developed to write data to sequential I/O devices with no file system of their own.
iamwho
2020-07-15 14:56:31 +08:00
这和 linux 有什么关系?
byzf
2020-07-16 13:58:36 +08:00
我有个 100G 的文件夹, 拷贝了一份, 是不是必须占用 200G 硬盘?

答: 压缩

我不想用压缩

答: 那你在问啥
chzhx
2020-07-16 15:45:17 +08:00
记得当时 aix 下的 tar 没有-z 参数,我是用管道打包和解压的。
tar -cvf - xxxx | gzip >xxxx.tar.gz
gzip -cd xxxx.tar.gz | tar -xvf -

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/690058

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX