我正在尝试获取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
切换是来自早期测试的宿醉,所以我从上面的代码中删除了它。)
答案 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