如何通过管道将 ls 传递给 grep,并删除 grep 过滤的文件?

如何通过管道将 ls 传递给 grep,并删除 grep 过滤的文件?

我想删除主文件中的某些包,但文件名太长 ( google-chrome-stable_current_i386.deb)。因此,我决定使用命令ls|grep chrome|rm将文件通过管道传输到 grep 来过滤掉 chrome 文件,然后将其删除。它不起作用,所以我想看看如何做到这一点。

答案1

这几乎让我皱起了眉头。

  1. 你可能不想再指出这一点霰弹枪在你的脚下。基本上任何类型的解析ls都会更多复杂且容易出错比像这样的既定方法find [...] -exec或者球体
  2. 除非有人为你安装了巨魔发行版,否则你的 shell 已经Tab完成。只需键入rm google并按Tab。如果没有立即完成,请Tab再次按 以查看匹配文件的列表。键入文件名的更多字符以缩小范围,直至完成,然后运行命令。
  3. 管道!=参数。标准输入是二进制数据流可以异步地输入命令。参数是空格分隔的字符串,在运行命令时仅将其传递给命令一次。这些很少可以互换。

答案2

你的想法是正确的,只是错过了一些细节。由于您正在处理传入 STDIN 的列表并rm需要参数,因此您需要使用xargs.

因此:

ls | grep chrome | xargs rm

应该给你你想要的。

请注意,如果您想删除chrome文件以外的所有内容,只需添加-v到该grep语句即可。

请注意,根据此问题的其他答案,这可能是实现您想要完成的任务的糟糕方法。

答案3

您还可以使用带有通配符的 find 命令:

find . -maxdepth 1 -name '*chrome*' -delete

请注意,“-maxdepth”参数确保 find 仅在当前目录中工作,并且不会递归到子目录。

答案4

touch 0 1 2 3 4 5 6 7 8 9
find . -name \[0-9] -ok rm {} \;

< rm ... ./0 > ? y
< rm ... ./9 > ? y
< rm ... ./8 > ? y
< rm ... ./7 > ? y
< rm ... ./6 > ? y
< rm ... ./5 > ? y
< rm ... ./4 > ? y
< rm ... ./3 > ? y
< rm ... ./2 > ? y
< rm ... ./1 > ? y
^C

...使用-name '*c*.deb'或其他适合您的模式。

相关内容