删除名称中没有字符串的文件


9

我要删除名称中不包含字符串“ 999”(不带“'')的文件。

我努力了:

grep -vlr 999 . | xargs -0 rm -f --
find . -print0 | grep --null-data -v 999 | xargs -0 rm --

但是它们都不起作用。我正在使用bash 3.2.57的macOS Sierra。


2
grep -l使它列出-v内容(而不是文件名)中找到(或找不到)匹配项的文件。grep始终与您指定文件的内容匹配,而不与它们的名称匹配。
JoL

Answers:


18

在中使用扩展的球形模式bash

rm ./!(*999*)

这需要shopt -s extglob启用(为了安全起见,也要启用shopt -s failglob,以便!(*999*)如果所有文件名都包含,则不会错误地删除具有异常名称的文件999)。该模式!(*999*)将匹配当前目录中的任何名称,但那些名称与匹配除外*999*。要还删除隐藏的文件(名称以开头的文件),请同时启用该dotglob选项。

只关心普通文件或指向普通文件的符号链接(而不是目录等):

for name in ./!(*999*); do [ -f "$name" ] && rm "$name"; done

zsh相当于上述循环的shell将是

rm ./(^(*999*))(.)

您的第一个命令将不起作用,因为grep它将查看文件内部。它将删除所有没有行的文件999(您已添加了--null选项,使其可以使用xargs -0)。

您的第二个命令将不起作用,因为grep在macOS上不支持--null-data(但是它有一个--null选项,仅用于生成文件名输出时)。还要注意,它将查找999文件路径中的任何位置(包括目录组件),而不仅仅是文件名。


1
您还希望启用该failglob选项,否则!(*999*)如果没有其他名称不包含的文件,它最终可能会删除被调用的文件999
斯特凡Chazelas

16

只需反转名称条件find

find . -type f \! -name "*999*" 

添加-delete-exec rm {} +实际删除匹配的文件。


2
!在中是安全的bash
库萨兰达
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.