19

有一个目录包含以下文件:

.
├── bla-bla-bla1.tar.7z
├── bla-bla-bla2.tar.7z
├── bla-bla-bla3.tar.7z
└── _bla-bla-bla_foo.tar.7z

我需要查找删除格式为*.7zexcept的所有文件_*.7z

我试过了:

find /backups/ -name "*.7z" -type f -mtime +180 -delete

我该怎么做?

4

4 回答 4

27

另一种方法是使用附加的否定主节点find

 find /backups/ -name "*.7z"  ! -name '_*.7z' -type f -mtime +180 -delete

其他答案中的简单正则表达式更适合您的用例,但这演示了使用!可用于find.

于 2013-09-26T15:11:20.527 回答
11

在正则表达式中,^运算符的意思是“除此之外的任何字符”。因此[^_]表示“除 _ 之外的任何字符”。例如:

"[^_]*.7z"

因此,如果您打算排除以开头的文件_,您的完整命令行将是:

find /backups/ -name "[^_]*.7z" -type f -mtime +180 -delete

如果您想排除的任何出现_,您可以使用 的andnot运算符find,例如:

find . -name "*.7z" -and -not -name "*_*"
于 2013-09-26T06:24:36.840 回答
0

它应该是

 find . -name "*[^_].7z" 
于 2013-09-26T06:38:08.403 回答
0

鉴于您拥有 bash 4.2.25,一个快速的方法是简单地使用 bash 模式匹配来删除所有 .7z,但具有 _.7z 的那些,如下所示:

touch a.7z b.7z c.7z d_.7z e_.7z f.txt
rm *[^_].7z
于 2013-09-26T06:39:13.877 回答