xargs 删除包含 $ 的文件名

xargs 删除包含 $ 的文件名

我正在使用 xargs 从远程服务器删除文件。

xargs -a /var/log/del.log -i -exec  ssh [email protected] 'rm  -rf "{}"'

del.log包含本地服务器上已删除文件的路径,我想在远程服务器上删除它们。一切正常,但当它们是临时办公文件时,问题就开始了,例如~$excel.xlsx当文件命名像这样时,xargs 会发出如下命令。

ssh [email protected] 'rm -rf "~.xlxs"'  - which is wrong,

它应该是这样的 -ssh [email protected] 'rm -rf "~$excel.xlxs"'

为什么 xargs 会这样?可能是 xargs 将其视为变量。我需要一些解决方案。

或者有没有更好的方法从远程服务器删除文件?假设本地服务器有需要在远程删除的路径列表。

答案1

xargs -a /var/log/del.log -i -exec  ssh [email protected] 'rm  -rf "{}"'

交换单引号和双引号:

xargs -a /var/log/del.log -i -exec  ssh [email protected] "rm  -rf '{}'"

那么命令将扩展为:

ssh [email protected] "rm -rf '~$excel.xlxs'"

并且它工作正常,因为:

man bash

将字符括在单引号中可保留引号内每个字符的字面值。单引号之间不能出现单引号,即使前面有反斜杠。

将字符括在双引号中会保留引号内所有字符的字面值,但 $ 除外,, \, and, when history expansion is enabled, !. The characters $ and 在双引号内保留其特殊含义。

答案2

shell 将符号后面$和 之前的单词解释.为变量。由于$excel未设置为变量,也不是环境变量,因此 shell 将其替换为空字符串。因此

  ~$excel.xlxs  ==>  ~.xlxs     when you replace the variable with an empty string.

为了解决这个问题,你需要在美元符号前面加上escape character \-

   rm -rf ~\$excel.xlsx

相关内容