同时压缩和压缩,无中间保存


63

规范的方法是:

  • scp 文件到远程位置
  • 压缩传输中的文件(是否压缩tar单个文件或整个文件夹,7za或什至更高效的文件)
  • 执行上述操作而不保存中间文件

我对这样的外壳管道很熟悉:

tar cf - MyBackups | 7za a -si -mx=9 -ms=on MyBackups.tar.7z

实质上:

  • 将整个文件夹滚动到一个文件夹中 tar
  • 将数据传递stdoutstdin压缩程序
  • 应用积极的压缩

通过ssh链接将文件放置在远程文件系统上的最佳方法是什么?


我不喜欢sshfs坐骑。


这不起作用:

scp <(tar cvf - MyBackups | 7za a -si -mx=9 -so) localhost:/tmp/tmp.tar.7z

因为:

/dev/fd/63: not a regular file

Answers:


102

有很多方法可以做您想要的。最简单的方法是使用pìpe:

tar zcvf -  MyBackups | ssh user@server "cat > /path/to/backup/foo.tgz"

在这里,压缩由tar哪个调用gzipz标志)处理。您也可以使用compressZ)和bzipj)。对于7z,请执行以下操作:

tar cf - MyBackups | 7za a -si -mx=9 -ms=on MyBackups.tar.7z | 
   ssh user@server "cat > /path/to/backup/foo.7z"

最好的方式,但是,可能是rsync

   Rsync is a fast and extraordinarily versatile  file  copying  tool.   It  can  copy
   locally, to/from another host over any remote shell, or to/from a remote rsync dae‐
   mon.  It offers a large number of options that control every aspect of its behavior
   and  permit  very  flexible  specification of the set of files to be copied.  It is
   famous for its delta-transfer algorithm, which reduces the amount of data sent over
   the network by sending only the differences between the source files and the exist‐
   ing files in the destination.  Rsync is widely used for backups and  mirroring  and
   as an improved copy command for everyday use.

rsync办法太多的选择。确实值得一读它们,但一见钟情。在这种情况下,您关心的是:

    -z, --compress              compress file data during the transfer
        --compress-level=NUM    explicitly set compression level

   -z, --compress
          With this option, rsync compresses the file data as it is sent to the desti‐
          nation machine, which reduces the amount of data being transmitted --  
          something that is useful over a slow connection.

          Note  that this option typically achieves better compression ratios than can
          be achieved by using a compressing remote shell or a  compressing  transport
          because  it takes advantage of the implicit information in the matching data
          blocks that are not explicitly sent over the connection.

因此,在您的情况下,您需要这样的东西:

rsync -z MyBackups user@server:/path/to/backup/

这些文件在传输过程中将被压缩,并在目标位置解压缩。


其他一些选择:

  • scp 本身可以压缩数据

     -C      Compression enable.  Passes the -C flag to ssh(1) to
             enable compression.
    
    $ scp -C source user@server:/path/to/backup
    
  • 也许有一种获得rsync7za发挥良好的方法,但这样做毫无意义。这样做的好处rsync是,它将仅复制本地文件和远程文件之间已更改的位。但是,较小的本地更改可能会导致完全不同的压缩文件,因此没有必要使用rsync此文件。它只会使事情变得复杂,没有任何好处。ssh如上所示,直接使用即可。如果您确实要执行此操作,则可以尝试通过将subshel​​l用作参数rsync。在我的系统上,我无法使用7za它,因为它不允许您将压缩数据写入终端。也许您的实现是不同的。试试类似的东西(这对我不起作用):

    rsync $(tar cf - MyBackups | 7za a -an -txz -si -so) \
      user@server:/path/to/backup
    
  • 另一点是,7z 不应将其用于Linux上的备份。如7z手册页所述:

    在Linux / Unix上,请勿将7-zip格式用于备份目的,因为:
    -7-zip不存储文件的所有者/组。


3
需要补充的一点是,除非您通过一般缓慢的网络(例如互联网)进行传输,否则最好避免压缩,因为它只会降低传输速率。在局域网上,-z速度至少要慢两倍。要获得比ssh上的rsync更快的速度,请设置rsync守护进程和使用-Wflag的rsync (复制整个文件(不包括delta-xfer算法)
。– laebshade

2
谢谢!我将接受这个好答案,但是请添加一个完整的独立命令行,该命令行同时使用rsync 7za,最终输出到远程文件系统。我喜欢-z但是我想解压缩压缩级,所以.. rsync在这种情况下,我将如何使用?
Robottinosino

2
@Robottinosino看到更新的答案。rsync与一起使用毫无意义7z。如图所示,它应该可以与rsync和subshel​​一起使用,但是无论如何我都无法弄清楚。
terdon

4
为+1 scp -C。远程磁盘上没有足够的空间来容纳压缩文件,因此在传输之前我无法进行压缩。一个小的命令行选项使我的问题消失了。
user37931 2014年

1
@knutole只需先压缩文件,然后rsync即可。如果您需要更多详细信息,请提出一个新问题。
terdon

13

我认为这个命令可以解决问题

ssh user@host "cd /path/to/data/;tar zc directory_name" | tar zx 

编辑:早期版本具有两个错误的“ f”选项。

现在,首先必须从目标主机执行此命令。并详细说明:

  1. ssh user @ host将打开与主机的连接,并从该主机传输数据。
  2. cd / path / to / data将进入存储所需数据的目录
  3. tar zc *将启动压缩并将其放入STDOUT
  4. 现在pipe(|)将把源的STDOUT管道传输到运行“ tar zx”的目标的STDIN,并不断对来自源的数据流进行解压缩。

如您所见,此命令可以即时压缩并节省带宽。您也可以使用其他压缩来获得更好的结果,但是请记住,压缩和解压缩需要CPU周期。

参考


tar:旧选项'f'需要一个参数。
Dimitri Kopriwa 2015年

7

dkbhadeshiya的答案有一些小改进:您不必这样做cd dir,只需将工作目录指定为tar

ssh user@host "tar -C /path/to/data/ -zc directory_name" | tar zx 

您也可以通过以下方式上传目录:

tar zc directory_name/ | ssh user@host "tar zx -C /new/path/to/data/"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.