无法直接使用xagrs将带引号的字符串传递给rm

时间:2019-05-14 07:00:08

标签: bash pipe xargs

要使用grep查找某些文件并使用rm删除它们,我尝试使用以下命令-

$ ls | grep 2019 | xargs -i rm \"{}\"

那没有用。得到了以下错误消息-

rm: cannot remove '"2019-05-10 00:00:00-TO-2019-05-10 23:59:59_PDT_disconnection_info.csv"': No such file or directory

看起来xargs确实是引号。因此,尝试echo而不是直接传递-

ls | grep 2019 | xargs -i echo \"{}\" | xargs rm

这行得通。

为什么不进行echo处理就不能使用?

1 个答案:

答案 0 :(得分:1)

正确的引用由xargs完成,无需再次引用。只是:

 ... | xargs -i rm {}

或者更好,因为rm接受多个参数,只需执行以下操作:

 ... | xargs rm
  

为什么不回声就不起作用?

当不与-i,-I,-d或类似符号一起使用时,xargs实用程序可处理输入中带双引号或单引号的正确引号或带反斜杠的转义。引号由第二个xargs删除,并且rm传递不带引号的字符串。来自man xargs

 .... xargs reads
 items from the standard input, delimited by blanks (which can be
 protected with double or single quotes or a backslash)

比较:

$ echo "\e\r\t\q\e" | xargs -t echo
echo ertqe 
ertqe

另请参阅Why you shouldn't parse the output of ls(1)