2013-09-26 2 views
9

У меня есть Дире:Как найти файлы, кроме имени?

  • бла-бла-bla1.tar.7z
  • бла-бла-bla2.tar.7z
  • бла-бла-bla3.tar.7z
  • _bla-бла-bla_foo.tar.7z

Мне нужно найти и удалить все файлы ".7z" кроме "_ .7z"

Я использую find/backups/-name «* .7z» -type f -mtime +180 -delete

Как я могу это сделать?

ответ

8

В регулярных выражениях оператор ^ означает «любой символ, кроме». Таким образом, [^_] означает «любой символ, кроме _». Например:

"[^_]*.7z" 

Таким образом, если ваше намерение исключить файлы начиная с _, ваша полная командная строка будет выглядеть так:

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

Если вы хотите исключить любой occerance из _, вы можете использовать and и not операторы find, как:

find . -name "*.7z" -and -not -name "*_*" 
+1

Спасибо за это "[^ _] *. 7z" его очень легко :) – user2818137

0

Быстрый способ дал вам иметь Баш 4.2.25, можно просто использовать Баш сопоставление с образцом, чтобы удалить все .7z, но те из них, имеющие _.7z, как это:

touch a.7z b.7z c.7z d_.7z e_.7z f.txt 
rm *[^_].7z 
+0

Это не сработает. Попробуйте сами. – anishsane

+0

Размещено редактирование. Это работает, спасибо. –

10

Другой подход заключается в использовании дополнительного, отрицается первичны find:

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

простое регулярное выражение в других ответов лучше йо ur, но это демонстрирует более общий подход с использованием оператора !, доступного для find.