通过 SSH 移动文件并在成功完成最终复制后在源上删除

通过 SSH 移动文件并在成功完成最终复制后在源上删除

我有一个文件夹,里面有大约 200 000 个文件,总大小约为 300 GB,我需要通过 SSH 连接将其传输到远程主机。我正在寻找一种方法,在验证本地文件已成功复制到远程主机后删除这些文件,但我不知道该怎么做。rsync --remove-source-files根据其他帖子,如果连接中断,这似乎不安全 (这里)。如何才能安全地做到这一点?

答案1

有一个 shell 脚本:
请注意,它做出了一些假设,我已在下面记录下来。

#!/bin/sh

# first, upload the directory structure
# be REALLY sure that it made it intact!
while true
do
    # try to upload it:
    rsync $flags --filter="+ */" --filter="- *" $source $destination
    # it uploaded fine? cool, break the loop (else try again):
    [ "$?" -eq 0 ] && break
done

# now the files
for file in $(find $source -not -type d)
do
    # again, be REALLY sure they copied okay!
    while true
    do
        # try to upload it:
        rsync $flags $file $destination/$file
        # it uploaded fine? cool, break the innermost loop (else try again):
        [ "$?" -eq 0 ] && break
    done
    # delete the local copy of the file:
    rm $file
done

此脚本假设如下:

  1. 其中$source,、$destination$flags要么被设置为环境变量,要么在脚本中用实际的源、目标和rsync您想要使用的任何其他标志替换。(不要替换$?$file。)
  2. $source是一条相对路径。
  3. 如果rsync无论出于什么原因指定的$file复制未 100% 成功。
  4. 您已经对不太重要的数据进行了测试,因为我还没有。

参数rsync --filter复制自一篇博客文章经过有个叫菲尔的家伙。我希望他能接受这一点。:)

答案2

也许你可以使用SSHFS. sshfs 可让您通过 ssh “挂载”远程目录(实际上是执行其他 ssh 命令来模拟文件系统)。然后您可以使用它mv来移动文件。

您不需要成为超级用户,因为它是一个用户空间文件系统。

答案3

例如,你可以将文件分成十个块,然后

rsync (source files) destination

如果运行成功,则继续

rsync --remove-source-files (source files) destination

第二个 rsync 命令增加的带宽可以忽略不计。

相关内容