当名称不包含某些单词时删除文件

发布于 2024-11-18 03:40:58 字数 351 浏览 3 评论 0原文

我正在使用 Linux 并打算使用 shell 删除一些文件。

我的文件夹中有一些文件,一些文件名包含“好”一词,另一些则不包含。 例如:

ssgood.wmv
ssbad.wmv
goodboy.wmv
cuteboy.wmv

我想删除名称中不包含“good”的文件,因此剩余的文件是:

ssgood.wmv
goodboy.wmv

如何在 shell 中使用 rm 来做到这一点?我尝试使用

rm -f *[!good].*

但它不起作用。

多谢!

I am using Linux and intend to remove some files using shell.

I have some files in my folder, some filenames contain the word "good", others don't.
For example:

ssgood.wmv
ssbad.wmv
goodboy.wmv
cuteboy.wmv

I want to remove the files that does NOT contain "good" in the name, so the remaining files are:

ssgood.wmv
goodboy.wmv

How to do that using rm in shell? I try to use

rm -f *[!good].*

but it doesn't work.

Thanks a lot!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

痞味浪人 2024-11-25 03:40:58

该命令应该满足您的需要:

ls -1 | grep -v 'good' | xargs rm -f

它可能会比其他命令运行得更快,因为它不涉及使用正则表达式(这很慢,对于这样一个简单的操作来说是不必要的)。

This command should do what you you need:

ls -1 | grep -v 'good' | xargs rm -f

It will probably run faster than other commands, since it does not involve the use of a regex (which is slow, and unnecessary for such a simple operation).

秋风の叶未落 2024-11-25 03:40:58

使用 bash,您可以通过 extglob 获得“负”匹配外壳选项:

shopt -s extglob
rm !(*good*)

With bash, you can get "negative" matching via the extglob shell option:

shopt -s extglob
rm !(*good*)
花开浅夏 2024-11-25 03:40:58

您可以将 find-not 运算符:

find . -not -iname "*good*" -a -not -name "." -exec rm {} \;

我已经使用 -exec 在那里调用 rm,但是 我想知道 find 是否有内置删除操作 确实如此,请参阅下面

非常对此要小心。请注意,在上面我必须放入 -a -not -name "." 子句,因为否则它会匹配当前目录 .。因此,在放入 -exec rm {} \; 位之前,我会使用 -print 进行彻底测试!

更新:是的,我从未使用过它,但确实有一个-delete操作。所以:

find . -not -iname "*good*" -a -not -name "." -delete

再次强调,要小心并仔细检查您匹配的内容是否超出了您想要匹配的内容。

You can use find with the -not operator:

find . -not -iname "*good*" -a -not -name "." -exec rm {} \;

I've used -exec to call rm there, but I wonder if find has a built-in delete action it does, see below.

But very careful with that. Note in the above I've had to put an -a -not -name "." clause in, because otherwise it matched ., the current directory. So I'd test thoroughly with -print before putting in the -exec rm {} \; bit!

Update: Yup, I've never used it, but there is indeed a -delete action. So:

find . -not -iname "*good*" -a -not -name "." -delete

Again, be careful and double-check you're not matching more than you want to match first.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文