为什么当通过列表重新迭代时,我的 while 循环在 scp 中没有工作

14 浏览
0 Comments

为什么当通过列表重新迭代时,我的 while 循环在 scp 中没有工作

我正在尝试使用while循环将服务器上的文件列表传输到我的计算机,但它一直报告找不到文件或目录的错误。我不明白为什么会这样。

所以我有一个包含500多行的文件列表list_numbers.txt

list_numbers.txt
1234
345
2135
2132
...

我想重新迭代这个列表,将文件从服务器传输到我的计算机,并将文件夹名称替换为$line_assembly,同时将assembly_graph.txt替换为$line_for_assembly.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。我不知道我做错了什么。

0
0 Comments

问题出现的原因是因为没有一个名为line_assembly的变量。解决方法是使用以下代码:

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

这将展开line的值,后面跟着文本"_assembly"。

例如,如果"line"的值为"component",你将得到.../Documents/component_assembly/...

编辑:OP在输入文件中有多余的字符(可能是来自Windows的\r字符)。我已根据OP的具体问题编辑了答案。

嗨GMc,我尝试了这个,但是现在它给我这个错误_assembly/assembly_graph.txt: No such file or directory

我猜我看不到你的任何目录,所以我只能问一下,远程(或本地)系统上是否存在该文件?另外,我注意到在我的回答中我没有正确地“转义”目标路径,这将产生完全相同的问题,所以我将相应地更新我的答案。

此外,你可能需要确保你的输入文件没有任何多余的字符。在scp之前,你可以尝试添加line=`echo $line | tr -d '\r\n'`

天哪,它起作用了。就是line=echo $line | tr -d '\r\n'起了作用。我猜有一些我没有看到的额外字符。这个问题困扰了我很久!非常感谢GMc!

不客气,感谢你接受我的答案(大多数人不会这样做,即使他们在评论中说解决了他们的问题)。顺便说一下,以后你可以使用hexdump -C list_numbers.txt查看文件的详细内容。在你的文件上试一试。通常,Linux文本文件以单个换行符结尾,它在hexdump中显示为0A。Windows文本文件使用两个字符,它在hexdump中显示为0D 0A。

你为我节省了数小时手动输入每个文件的时间,所以真的非常感谢!啊,那是一个方便的一行文件检查!我想因为我将它保存为一个文本文件从一个xlsx文件,所以它一定拾取了额外的字符。好知道!

0