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

时间:2017-04-19 05:39:36

标签: scp cat xargs

我在远程服务器上有大约一千个文件(所有文件都在不同的目录中)。我想将它们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:非法选项 - 我

如何让此命令起作用?

谢谢, 艾娜。

1 个答案:

答案 0 :(得分:1)

您收到此错误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 .