给grep输出到rm


47

我正在尝试将grep输出传递给rm,但它会输出无用的东西。是否需要任何开关rm?或者可以rm直接提供正则表达式?

ls | grep '^\[Daruchini'| rm

rm:缺少操作数请尝试使用rm --help获取更多信息。


始终复制粘贴错误消息。(为了方便将来的读者,我插入了实际的错误消息。但是我只能这样做,因为在这种情况下只有一种可能的错误消息。在大多数情况下,拥有准确的错误消息来理解问题至关重要。(因此,请始终完整地复制并粘贴所有错误消息。)
吉尔斯(Gilles)'所以

Answers:


57

您需要使用xargs将标准输入转换为的参数rm

$ ls | grep '^Dar' | xargs rm

(当心文件名中的特殊字符;对于GNU grep,您可能更喜欢

$ ls | grep -Z '^Dar' | xargs -0 rm

另外,虽然shell不使用正则表达式,但这是一个简单的模式:

$ rm Dar*

(与此同时,我认为我需要更多的睡眠。)


2
假设提问者在发布问题时没有犯错,在提问之后rm Dar*,不是rm !(Dar*)
吉尔(Gilles)“所以,别再邪恶了”,

...对,是的,我被困在zsh ^模式中(与basg !事情类似)。
geekosaur 2011年

1
+1好答案,我必须在位| tr "\n" "\0"之前添加xargs。:看在这个岗位stackoverflow.com/questions/20307299/...
亚当Plocher


3

如果要用grep换行符而不是空格来分隔输出,则可以xargs通过-d选项将其指定为。

$ ls | grep '^Dar' | xargs -d '\n' rm

(如问题所述)


2

为了将输出作为参数传递,我倾向于使用while循环,因为我对xargs并不熟悉。

ls | grep '^Dar' | while read line; do rm "$line";done;

这是对我而言唯一有效的方法。
marbel

0

对我来说最好的命令是:

find ./Daruchini* -exec rm {}\;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.