How to find files except given name?

2020-07-02 09:55发布

I have a dir with:

  • bla-bla-bla1.tar.7z
  • bla-bla-bla2.tar.7z
  • bla-bla-bla3.tar.7z
  • _bla-bla-bla_foo.tar.7z

I need to find and delete all files ".7z" except "_.7z"

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

How i can do it?

标签: linux bash find
4条回答
闹够了就滚
2楼-- · 2020-07-02 10:14

It should be

 find . -name "*[^_].7z" 
查看更多
forever°为你锁心
3楼-- · 2020-07-02 10:18

Another approach is to use an additional, negated primary with find:

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

The simple regex in the other answers is better for your use case, but this demonstrates a more general approach using the ! operator available to find.

查看更多
Juvenile、少年°
4楼-- · 2020-07-02 10:22

A quick way given you have bash 4.2.25, is to simply use bash pattern matching to remove all .7z, but the ones having _.7z, like this:

touch a.7z b.7z c.7z d_.7z e_.7z f.txt
rm *[^_].7z
查看更多
何必那么认真
5楼-- · 2020-07-02 10:23

In regular expressions, the ^ operator means "any character except for". Thus [^_] means "any character except for _". E.g.:

"[^_]*.7z"

So, if your intention is to exclude files starting with _, your full command line would be:

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

If you'd like to exclude any occerance of _, you can use the and and not operators of find, like:

find . -name "*.7z" -and -not -name "*_*"
查看更多
登录 后发表回答