2013-09-26 6 views
9

Ich habe dir mit:Wie finde ich Dateien außer dem Vornamen?

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

ich brauche zu finden und löschen Sie alle Dateien ".7z" außer "_ .7z"

Ich benutze find/backups/-name "* .7z" -Typ f -mtime +180 -delete

Wie kann ich es tun?

Antwort

8

In regulären Ausdrücken bedeutet der Operator ^ "ein beliebiges Zeichen außer für". Daher bedeutet [^_] "ein beliebiges Zeichen außer _". ZB:

"[^_]*.7z" 

Also, wenn Ihre Absicht Dateien auszuschließen ist mit _ beginnen, Ihre vollständige Befehlszeile wäre:

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

Wenn Sie jede occerance von ausschließen möchten

find . -name "*.7z" -and -not -name "*_*" 
: _, können Sie die and und not Betreiber von find, wie verwenden
+1

Danke für diese "[^ _] *. 7z" es ist sehr einfach :) – user2818137

0

Es sollte

find . -name "*[^_].7z" 
0

Ein schneller Weg sein, das Sie bash 4.2.25, bash Muster einfach ist gegeben zu verwenden passende alle .7z zu entfernen, aber die, die mit _.7z, wie folgt aus:

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

Dies wird nicht funktionieren. Versuche es selbst. – anishsane

+0

Platziert eine Bearbeitung. Das funktioniert, danke. –

10

ein weiterer Ansatz ist eine zusätzliche zu verwenden, negiert Primär mit find:

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

Die einfache regex in den anderen Antworten ist besser für yo Ihr Anwendungsfall, aber dies zeigt einen allgemeineren Ansatz unter Verwendung des !-Operators, der für find verfügbar ist.