【问题标题】:If tar is interrupted, it overwrites the first file it operates on. Is there any way I can prevent this?如果 tar 被中断,它会覆盖它操作的第一个文件。有什么办法可以防止这种情况吗?
【发布时间】:2017-04-19 02:39:16
【问题描述】:

我正在尝试通过 ssh 快速传输数百到数千个小文件,方法是创建它们的 tar 存档并通过 ssh 传输它们。

我的本​​地系统正在运行 Linux Mint 18.1,而我的远程系统正在运行 Ubuntu 16.04 Server。

例如,假设我有目录

/var/www/testing

以及其中的几个文件和子文件夹。

/var/www/testing/subdir1/*
/var/www/testing/subdir2/*
/var/www/testing/file1
/var/www/testing/file2
/var/www/testing/file3

我想将所有这些文件传输给我自己。因为文件太多,ssh一个一个传输很慢,所以我正在创建一个存档并传输存档:

ssh user@domain "cd /var/www; tar zcvf - testing" | "tar zxvf -"

只要 tar 命令不被打断,就可以完美运行。如果 tar 被中断,第一个文件,在本例中为 file1,将被覆盖为部分存档,包括每个文件,直到它被中断的文件。

是我正在做的事情导致这种情况吗?如何避免这种情况,或者有更好的方法来快速传输大量文件?

【问题讨论】:

  • 你看过rsync吗?在传输整个文件之前,它不会覆盖目标文件。它也只会复制新的或已更改的文件,并且可以重新启动以从中断处继续。它适用于ssh。
  • 您正在中断两个 tar 命令中的哪一个,您正在采取哪些步骤来导致中断?
  • 我考虑过 rsync,但我目前的理解是 rsync 仍然一次处理一个文件,因此在第一次同步数千个文件时速度很慢。我将中断 create-archive tar 命令,主要是由于执行时间限制,并且远程系统的文件将被覆盖(因为尚未将任何内容传输到本地系统)。
  • 如果tar c 覆盖了它的一个源文件,那就是一个错误。它不应该那样做。如果这是 GNU tar,请报告给bug-tar。
  • 这似乎是正在发生的事情,并且在我身上发生过好几次。在提交错误报告之前,我会检查是否有人发布了它并进行更多测试以查看它覆盖的条件。

标签: linux ssh tar file-transfer


【解决方案1】:

rsync 应该是一个很好的工具。

如果您想继续使用 tar 来完成这项工作,并且您的目标计算机的驱动器上确实有足够的空间,那么您可以先复制整个文件,并且只有在整个文件传输后才解压缩它。喜欢:

ssh user@domain "cd /var/www; tar zcvf - testing" | cat >/tmp/testing.tgz && tar xzvf /testing.tgz && rm -f /tmp/testing.tgz

您可能还想在 tar 中使用 p 标志,以保留权限。

【讨论】:

  • 我发布的命令不是这样工作的吗?我的印象是我正在创建存档、传输它,然后提取存档。
  • 经过进一步测试,我意识到我错了。我发布的命令实际上是在文件被压缩到存档时传输的。很高兴知道,谢谢!
猜你喜欢
  • 2018-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-22
  • 2018-02-02
  • 1970-01-01
  • 1970-01-01
  • 2011-09-17
相关资源
最近更新 更多