首页 > 解决方案 > 无法使用 xagrs 直接将带引号的字符串传递给 rm

问题描述

为了找到一些文件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从字面上引用引号。所以,尝试echoing 而不是直接传递 -

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

这行得通。

为什么没有echoing 就不行?

标签: bashpipexargs

解决方案


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

 ... | xargs -i rm {}

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

 ... | xargs rm

为什么没有回声就不能工作?

当不与 -i、-I、-d 或类似参数一起使用时,该xargs实用程序会使用双引号或单引号处理输入中的正确引用或使用反斜杠转义。引号被第二个删除xargsrm传递不带引号的字符串。来自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

另请参阅为什么不应该解析 ls(1) 的输出


推荐阅读