遍历列表时,为什么while循环无法通过scp工作

时间:2019-06-04 02:49:29

标签: bash macos scp

嗨,我正在尝试使用while循环将文件列表从服务器传输到我的计算机,但是它一直提示我没有文件或目录。我不明白为什么。

所以我的文件list_numbers.txt超过500行

list_numbers.txt
1234
345
2135
2132
...

我想再次遍历此列表,以将服务器上具有相应文件夹名的文件从服务器传输到我的计算机,但用$ line_for_assembly.txt替换assembly_graph.txt

while read line; do scp -r user@server.com:/home/Documents/$line_assembly/assembly_graph.txt /Users/Documents/$line_for_assembly.txt; done < list_numbers.txt

所以基本上,我希望它执行以下代码,但不必手动键入,而是会在列表中重新进行迭代。

scp -r user@server.com:/home/Documents/1234_assembly/assembly_graph.txt /Users/Documents/1234_for_assembly.txt

scp -r user@server.com:/home/Documents/345_assembly/assembly_graph.txt /Users/Documents/345_for_assembly.txt

scp -r user@server.com:/home/Documents/2135_assembly/assembly_graph.txt /Users/Documents/2135_for_assembly.txt

scp -r user@server.com:/home/Documents/2132_assembly/assembly_graph.txt /Users/Documents/2132_for_assembly.txt

但是我得到这个错误:

scp: /home/Documents//assembly_graph.txt: No such file or directory

因此,即使我执行$ {line} _assembly,它也不会拿起$ line_assembly。我不知道我在做什么错。

1 个答案:

答案 0 :(得分:0)

因为您没有名为line_assembly的变量。

也许您是指以下内容:

while read line
 do
  line=`echo $line | tr -d '\r\n'`
   scp -r user@server.com:/home/Documents/${line}_assembly/assembly_graph.txt /Users/Documents/${line}_for_assembly.txt
done < list_numbers.txt

这将扩展为line的值,后跟文本“ _assembly”。

例如,如果“行”的值为“组件”,您将得到

... /文档/ component_assembly /...

编辑:OP在他/她的输入文件中包含虚假字符(可能是Windows的\ r字符)。我已经相应地编辑了答案,以适应OP的特定问题。