我正在使用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