在我的 3 TB 外部硬盘驱动器上,我有一个 2.7 TB 目录,其中包含相对较小的文件。我想压缩这个 2.7 TB 目录并将其删除以仅保留压缩版本。问题是我没有足够的存储空间来首先存储zip
非rm
压缩目录。
有没有办法解决这个问题,或者我是否必须获得更多的存储空间来进行操作?
答案1
您可以尝试--remove-files
使用 tar 参数。假设您想压缩目录 FOO 上的所有内容,您将:
tar -czf FooCompressed.tar.gz --remove-files FOO
参数解释:
- c: 创建 TAR
- z:使用GZIP压缩,您可以切换到
-j
BZIP2或-J
LZMA(xz) - f:输出到文件而不是STDOUT
- 删除文件:不言自明
答案2
如果目录中的最大文件小于 300GB(可用空间量),最简单的选择是单独压缩文件而不是创建存档;就像是
find directory -type f \! -name '*.xz' -print0 | xargs -0 xz -9
directory
将以压缩级别 9压缩所有未压缩的文件。xz
这将一次用相应的压缩版本替换一个文件,并添加.xz
扩展名(因此foo.txt
变为foo.txt.xz
)。
事实上,即使最大的文件大于可用空间,只要您有足够的小于可用空间的文件,这也可以工作:首先压缩较小的文件,这将逐渐释放越来越多的空间,直到(希望)您有足够的可用空间来处理最大的文件。
答案3
我通常从不制作 zip 文件,所以我不是专家,但zip
默认情况下看起来只是将文件添加到存档中,所以类似 (未经测试的- 包含一个rm
命令 = 可能危险的- 在拿你的数据冒险之前先测试一下自己):
for f in $(ls --sort=size --reverse); do zip -9 archive.zip $f; rm $f; done
在目录中,可能可以做到。
答案4
将这些 bash 函数添加到你的 ~/.bashrc 中:
xzd() { find $1 -type f \! -name '*.xz' -exec xz -9 {} \; ; }
xzdv() { find $1 -type f \! -name '*.xz' -print -exec xz -9 {} \; ; }
uxzd() { find $1 -type f -name '*.xz' -exec unxz -9 {} \; ; }
然后从命令行您可以执行以下操作:
mac@challenger:~/views$ du -sk HelloWorld/
236 HelloWorld/
mac@challenger:~/views$ xzd HelloWorld
mac@challenger:~/views$ du -sk HelloWorld
116 HelloWorld
mac@challenger:~/views$ uxzd HelloWorld
mac@challenger:~/views$ du -sk HelloWorld
236 HelloWorld
xzdv 是 xzd 的更详细形式,并在压缩时回显每个文件
mac@challenger:~/views$ xzdv ./HelloWorld/
./HelloWorld/.cproject
./HelloWorld/src/helloworld.c
...
mac@challenger:~/views$
(纳入评论中的建议 - 谢谢!!!)