xargs删除包含$的文件名

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

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

del.log包含在本地服务器上删除的文件的path,我想在远程服务器上删除它们。 每一件事情都可以正常工作,但是当它们是一个像~$excel.xlsx文件命名办公室文件时,问题~$excel.xlsx当这样的文件命名出现时,xargs会使命令变得像这样。

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

它应该像 – ssh [email protected] 'rm -rf "~$excel.xlxs"'

为什么xargs是这样做的? 可能是xargs除了它是可变的。 我需要一些解决scheme。

还是有更好的方法来从远程服务器上删除文件? 只要本地服务器具有需要在远程删除的path列表。

 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 , \, and, when history expansion is enabled, !. The characters $ and保留在双引号内的特殊含义。

shell正在解释$符号后面的单词. 作为一个variables。 由于$excel没有被设置为一个variables,也不是一个环境variables,所以shell用一个空stringreplace它。 所以

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

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

  rm -rf ~\$excel.xlsx