如何使用7z通过管道进行压缩?

如何使用7z通过管道进行压缩?

我用它来安全地创建备份(? - 它真的安全吗?有一个好的密码吗?):

# 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 -

问:但是如何使用 7z 和最大压缩率来做到这一点呢?

除了唯一的输出文件之外创建临时文件并不好,因为如果我需要在 180 GB FS 上压缩 ~100 GB 大小的文件/目录,我将没有足够的可用空间(例如:压缩文件将需要 ~60千兆字节)。

答案1

7z 的手册页对此进行了介绍:

-si    Read data from StdIn (eg: tar cf - directory | 7z a -si directory.tar.7z)

答案2

您是否有特定原因想要使用7z,或者您只是想要比 更好的压缩gzip

xz实用程序使用与 (LZMA) 相同的压缩算法7z,并允许与gzip.

tar cvf ... | xz -9 | openssl ...

答案3

从 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
  • a创建档案。需要文件名;我们只是.xz滥用它来设置存档类型,因为我们实际上并不关心名称
  • -si从标准输入读取
  • -so写入标准输出
  • x提炼;还必须指定-t类型,因为我们没有创建带有文件名的存档

答案4

要快速创建我所有主脚本的远程备份准备文件。我使用以下命令:

# Scripts backup
ls ~/*.sh | cpio -ov | 7z a -si ~/Documents/SCRIPT_BACKUP_30062017.cpio.7z
# Scripts restore
7z x -so ~/Documents/SCRIPT_BACKUP_30062017.cpio.7z | cpio -iv   

我不备份“主”根目录的原因是我专门同步并仅发送一些目录。请注意 cpio 在恢复时如何跳过并检查较新的现有文件。这很强大。您的工作不会被覆盖。

芽@

相关内容