How to find files except given name?

前端 未结 4 1385
-上瘾入骨i
-上瘾入骨i 2021-02-13 01:50

There is a directory containing the following files:

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


        
相关标签:
4条回答
  • 2021-02-13 02:08

    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.

    0 讨论(0)
  • 2021-02-13 02:09

    It should be

     find . -name "*[^_].7z" 
    
    0 讨论(0)
  • 2021-02-13 02:20

    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
    
    0 讨论(0)
  • 2021-02-13 02:21

    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 "*_*"
    
    0 讨论(0)
提交回复
热议问题