我正在尝试从txt文件中读取文件名,并将FTP服务器中的文件从一个文件夹移动到另一个文件夹。我有以下命令
grep '.rar' /home/xxxxx/public_html/xxxx/download.txt | while read -r line ; do lftp -e 'set net:timeout 20; mv "Folder Name/${line}" "Folder Name/tmp/${OUTPUT}"; bye' -u username,password ftps://11.11.11.11:990 ; done
但是,$ {$ line}变量未被值替换,FTP服务器正在显示
file/directory not found (Folder Name/${line})
任何指针都会受到赞赏。 (如果有帮助的话,我在Centos 6.5上。)
答案 0 :(得分:1)
你有整个命令单引号,这可以防止bash参数扩展。您可以通过反转单引号和双引号来修复该部分,如下所示:
grep '.rar' /home/xxxxx/public_html/xxxx/download.txt | while read -r line ; do lftp -e "set net:timeout 20; mv 'Folder Name/${line}' 'Folder Name/tmp/${OUTPUT}'; bye" -u username,password ftps://11.11.11.11:990 ; done
假设您没有包含换行符或单引号的文件,我应该这样做。
为了帮助抵御特殊字符,您可以使用printf
而不是直接扩展到以下位置:
grep '.rar' /home/xxxxx/public_html/xxxx/download.txt | while read -r line ; do lftp -e "set net:timeout 20; mv '$(printf 'Folder Name/%q' "${line}")' '$(printf 'Folder Name/tmp/%q' "${OUTPUT}")'; bye" -u username,password ftps://11.11.11.11:990 ; done
因为我们可以使用printf
和%q
来打印可以在下一层命令中使用的引用/转义字符串