我正在使用它来安全地创建备份(? - 它真的安全吗?有一个好的密码吗?):
# ENCRYPT
ORIGDIR="DIRECTORYNAMEHERE"; tar cvf - "${ORIGDIR}/" 2>/dev/null | gzip -9 - 2>/dev/null | openssl aes-256-cbc -salt -out "${ORIGDIR}.tar.gz.aes"
# DECRYPT
openssl aes-256-cbc -d -salt -in "ENCDIRECTORYNAMEHERE" | tar -xz -f -
Run Code Online (Sandbox Code Playgroud)
问:但是如何使用具有最大压缩率的 7z 来做到这一点?
除了唯一的 OUTPUT 文件之外创建临时文件并不好,因为如果我需要在 180 GByte FS 上压缩 ~100 GByte 大小的文件/目录,我将没有足够的可用空间(如果例如:压缩文件将需要 ~60字节)。
Wie*_*and 33
这在 7z 的手册页中有介绍:
-si Read data from StdIn (eg: tar cf - directory | 7z a -si directory.tar.7z)
Run Code Online (Sandbox Code Playgroud)
您是否有7z特别想要使用的原因,或者您只是想要比 更好的压缩gzip?
该xz实用程序使用与7z(LZMA)相同的压缩算法,并允许与gzip.
tar cvf ... | xz -9 | openssl ...
Run Code Online (Sandbox Code Playgroud)
从 stdin 读取并写入 stdout 的一些示例:
echo "hello world" | 7z a .xz -si -so | xz -dc # hello world
echo "hello world" | 7z a .xz -si -so | wc -b # 64
echo "hello world" | 7z a .xz -si -so | 7z x -txz -si -so # hello world
7z x -so db.sql.xz | less # preview compressed database file
Run Code Online (Sandbox Code Playgroud)
a创建档案。需要文件名;我们只是.xz滥用它来设置存档类型,因为我们实际上并不关心名称-si从标准输入读取-so写入标准输出x提炼; 还必须指定-t类型,因为我们没有创建带有文件名的存档作为记录,因为该线程已经很旧了。
7-zip 不允许 7z 格式的流式写入,它在写入时需要自由查找访问,其中包括操作结束时的标头。不过,它确实允许传输标准 *nix 格式,例如 bz2、gz、xz。它还允许不受限制地传输单个输入(使用-si开关)。
因此,可以将单个文件压缩为 7z 格式,但无法进一步通过管道传输。
$ cat archive.tar | 7z a -si archive.tar.7z
Run Code Online (Sandbox Code Playgroud)
其他格式,如提到的 bz2、gz、xz 可以写入标准输出(带-so开关)。
$ cat archive.tar | 7z a -tgzip -si -so -an > archive.tar.gz
==
$ 7z a -si -so -tgzip -an < archive.tar > archive.tar.gz
Run Code Online (Sandbox Code Playgroud)
这显然允许进一步管道化:
$ cat archive.tar | 7z a -tgzip -si -so -an | wc -c
Run Code Online (Sandbox Code Playgroud)
请注意禁用解析 archive_name 的-an开关。天知道它到底做了什么——这个程序有点神奇,你必须应对它的怪癖。此行为的示例可以在此处找到。