我在远程服务器上有大约一千个文件(所有文件都在不同的目录中)。我想将它们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:非法选项 - 我
如何让此命令起作用?
谢谢, 艾娜。
答案 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/
提取双方想要相同的部分因此:
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 .
等