从文本文件中的列表安全地将文件从远程服务器复制到本地计算机

Secure copying files from a remote server to local machine from a list in a text file

我在远程服务器上有大约一千个文件(都在不同的目录中)。我想将它们 scp 到我的本地机器。我不想连续 运行 scp 命令一千次,所以我创建了一个文本文件,其中包含远程服务器上的文件位置列表。它是一个简单的文本文件,每一行都有一个路径,如下所示:

...

/iscsi/archive/aat/2005/20050801/A/RUN0010.FTS
/iscsi/archive/aat/2006/20060201/A/RUN0062.FTS
/iscsi/archive/aat/2013/20130923/B/RUN0010.FTS
/iscsi/archive/aat/2009/20090709/A/RUN1500.FTS

...

我搜索并发现有人试图做类似但不相同的事情 here。我要编辑的命令如下:

cat /location/file.txt | xargs -i scp {} user@server:/location

在我的例子中,我需要这样的东西:

cat fileList.txt | xargs -i scp user@server:{} .

要使用 fileList.txt 中的列表从远程服务器下载文件,该列表位于与我 运行 此命令相同的目录中。

当我 运行 这个时,我得到一个错误:xargs: illegal option -- i

如何让这个命令生效?

谢谢, 艾娜.

您收到此错误 xargs: illegal option -- i 因为 -i 已被弃用。请改用 -I {}(您也可以使用不同的替换字符串,但 {} 没问题)。

如果列表是远程的,文件是远程的,您可以执行此操作以在本地检索它并与 xargs -I {}:

一起使用
ssh user@server cat fileList.txt | xargs -I {} scp user@server:{} .

但这会创建 N+1 个连接,更重要的是,这会将所有远程文件(分散在您所说的不同目录中)复制到同一本地目录。可能不是你想要的。

因此,为了在本地重新创建类似的层次结构,让我们说 /iscsi/archive/aat 下的所有内容,您可以:

  • 使用cut -d/提取你想要两边相同的部分
  • 使用子 shell 创建创建目标目录并将文件复制到那里的命令

因此:

ssh user@server cat fileList.txt \
| cut -d/ -f4- \
| xargs -I {} sh -c 'mkdir -p $(dirname {}); scp user@server:/iscsi/archive/{} ./{}'

应该可以,但开始看起来很乱,而且您仍然有 N+1 个连接,所以现在 rsync 看起来是更好的选择。如果你有无密码 ssh 连接,这应该有效:

rsync -a --files-from=<(ssh user@server cat fileList.txt) user@server:/ .

领先的 / 被 rsync 剥离,最后您将获得 ./iscsi/archive/....

下的所有内容

您也可以先将文件复制到本地,然后:

rsync -a --files-from=localCopyOfFileList.txt user@server:/ .

您还可以操作该文件以删除例如 2 个级别:

rsync -a --files-from=localCopyOfFileList2.txt user@server:/iscsi/archive .

等等