我正在使用 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'"
并且它工作正常,因为:
将字符括在单引号中可保留引号内每个字符的字面值。单引号之间不能出现单引号,即使前面有反斜杠。
将字符括在双引号中会保留引号内所有字符的字面值,但 $ 除外,
, \, 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