1

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

我有一个名为的文件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

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

知道语法有什么问题吗?

编辑:

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

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

并且/VAULT10通过/VAULT14在两台服务器上都存在,它只是下一个文件夹节点可能不存在。

这些文件是在本地与远程机器上标记为不同的文件,因此从作为正确数据源的远程机器复制,因此递归复制在这里不起作用(我认为-r开关是早期测试的遗留问题,所以我'已经从上面的代码中删除了它)。

4

2 回答 2

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
于 2013-07-12T15:48:52.270 回答
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
于 2013-07-12T16:10:00.853 回答