【问题标题】:Linux lftp mv command with variable带变量的 Linux lftp mv 命令
【发布时间】:2016-09-29 15:50:31
【问题描述】:

我正在尝试从 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 上)。

【问题讨论】:

  • 您将整个命令用单引号括起来,并且变量不会在单引号字符串中展开。如果您只是在 lftp 命令中反转单引号和双引号,它可能会起作用

标签: linux centos centos6


【解决方案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 来打印可以在下一层命令中使用的带引号/转义的字符串

【讨论】:

  • 修复了它。谢谢!
猜你喜欢
  • 2016-06-20
  • 2022-12-16
  • 1970-01-01
  • 2020-08-24
  • 1970-01-01
  • 1970-01-01
  • 2015-02-15
  • 2017-04-13
  • 2020-11-27
相关资源
最近更新 更多