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
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
.
It should be
find . -name "*[^_].7z"
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
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 "*_*"