在读取循环中构建SCP命令语法时出错

时间:2013-07-12 15:39:56

标签: bash scp

我正在尝试获取SCP从一台服务器复制到另一台服务器的文件列表,但该命令似乎没有在read循环中正确构建。

我有一个名为diff_tapes.txt的文件,其中包含要复制的文件列表,如下所示:

/VAULT14/TEST_V14/634001
/VAULT14/TEST_V14/634002
/VAULT14/TEST_V14/634003
/VAULT14/TEST_V14/634004
等等......

我正在使用的bash命令行如下:

while read line; do scp -p bill@lgrdcpvtsa:$line $line;done < /home/bill/diff_tapes.txt

当我从命令行执行它时(我在CentOS上运行,所以基本上是Red Hat)我得到:

/VAULT14/TEST_V14/634001: No such file or directory

...对于每个文件。

如果我再次添加-v开关以获取更多信息,我会看到以下内容:

debug1: Sending command: scp -v -p -f /VAULT14/TEST_V14/634001

远程服务器(lgrdcpvtsa)肯定有相关文件:

[bill@LGRDCPVTSA TEST_V14]$ pwd
/VAULT14/TEST_V14
[bill@LGRDCPVTSA TEST_V14]$ ls -ll
total 207200
-rw------- 1 bill bill 27263700 Apr 26 11:16 634001
-rw------- 1 bill bill 27263700 Apr 26 11:16 634002
-rw------- 1 bill bill 27263700 Apr 26 11:16 634003
-rw------- 1 bill bill 27263700 Apr 26 11:16 634004

就好像第二次在scp命令中$line,它被忽略了。

知道语法有什么问题吗?

修改

为清楚起见,文件列表更可能是这样的:

/VAULT14/634100_V14/634001
/VAULT11/601100_V11/601011
/VAULT12/510200_V12/510192

两台服务器上都存在/VAULT10/VAULT14,它只是下一个文件夹节点可能没有。

这些文件是本地与远程计算机上标记为不同的文件,因此从正确数据源的远程计算机进行复制,因此递归副本在此处不起作用(我认为-r切换是来自早期测试的宿醉,所以我从上面的代码中删除了它。)

2 个答案:

答案 0 :(得分:1)

  

/ VAULT14 / TEST_V14 / 634001:没有这样的文件或目录

这可能是因为本地计算机上不存在文件夹/VAULT14/TEST_V14/

结果:

mkdir /VAULT14/TEST14
while read line; do 
    scp -p bill@lgrdcpvtsa:"$line" "$line"
done < /home/bill/diff_tapes.txt

答案 1 :(得分:1)

错误可能是因为本地目录/VAULT14/TEST_V14/不存在。

您可以使用dirname命令从路径获取目录名,创建目录,然后执行scp命令。示例

while read line; do mkdir -p "$(dirname "$line")"; scp -rp bill@lgrdcpvtsa:"$line" "$line";done < /home/bill/diff_tapes.txt

-p选项告诉mkdir创建子目录,即使父目录不存在。

修改 这是将所有文件复制到/,因此已更改为以下完美运行的文件:

while read line; do mkdir -p "$(dirname "$line")"; scp -p bill@lgrdcpvtsa:"$line" "$line";done < /home/bill/diff_tapes.txt