为什么当通过列表重新迭代时,我的 while 循环在 scp 中没有工作
为什么当通过列表重新迭代时,我的 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。我不知道我做错了什么。
问题出现的原因是因为没有一个名为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文件,所以它一定拾取了额外的字符。好知道!