it-swarm.cn

给grep输出到rm

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

ls | grep '^\[Daruchini'| rm

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

50
CodeBladeRunner

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

$ ls | grep '^Dar' | xargs rm

(请注意文件名中的特殊字符;使用GNU grep,您可能更喜欢

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

另外,尽管Shell不使用正则表达式,但这是一个简单的模式:

$ rm Dar*

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

61
geekosaur

不解析ls的输出

在这里,让命令行管理程序过滤所需文件非常简单。请注意,正是Shell扩展了Dar*,而不是rm命令。 Shell执行的模式扩展称为 globbing

rm Dar*

在更复杂的情况下,查找find命令。

5

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

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

(如 this 问题中所述)

3
mherzl

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

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

在使用zsh的Catalina 10.15.3上,我发现处理换行符和空格的方式是:

 Sudo find / | grep -i 'yourString' | tr '\n' '\0' | xargs -0 -n1 rm -r 

换句话说,在用“ rm -0”删除新行之前,将没有空格的新行转换(tr\n到\ 0)。

另外,我总是使用'​​find'+'grep -i',因为'find -iname'有时什么都不输出。

最后一点:它查找并删除与“ yourString”匹配的文件和文件夹。仅对于文件,指定“ find -type f”,然后rm的选项“ -r”无效。

0
YvUh

对我来说最好的命令是:

find ./Daruchini* -exec rm {}\;
0
Bodale