2013-09-26 10 views
9

Ho un dir con:Come trovare i file tranne il nome dato?

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

ho bisogno di trovare ed eliminare tutti i file ".7z", tranne "_ .7z"

Io uso find/backups/-name "* .7z" -tipo f -mtime +180 -delete

Come posso farlo?

risposta

8

Nelle espressioni regolari, l'operatore ^ significa "qualsiasi carattere tranne che per". Pertanto, [^_] significa "qualsiasi carattere tranne _". Ad esempio:

"[^_]*.7z" 

Quindi, se la vostra intenzione è quella di escludere i file partire con _, la riga di comando completa sarebbe:

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

Se vuoi escludere qualsiasi occerance di _, è possibile utilizzare gli operatori and e not di find, come:

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

Grazie per questo "[^ _] *. 7z" è molto semplice :) – user2818137

0

Dovrebbe essere

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

Un modo rapido dato avete bash 4.2.25, è di usare semplicemente modello bash corrispondenza per rimuovere tutti .7z, ma quelli hanno _.7z, in questo modo:

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

Questo non funzionerà. Mettiti alla prova – anishsane

+0

È stata eseguita una modifica. Funziona, grazie. –

10

un altro approccio è quello di utilizzare un ulteriore, negata primaria con find:

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

La semplice espressione regolare nelle altre risposte è meglio per yo ur use case, ma questo dimostra un approccio più generale usando l'operatore ! disponibile per find.

Problemi correlati