Wie schließe ich mit find ein Verzeichnis nach Namen aus?

7

Ich habe viele Verzeichnisse auf meinem System, deren Struktur folgendermaßen aussieht:

\-----data
       \------- 001abc
       \------- 002abc
       \------- 003abc
       \------- 004abc
       \------- 005abc
       \ ....

Wenn ich ein bestimmtes Verzeichnis suchen möchte, gebe ich einfach ein, find . -iname "002abc*"aber wie kann ich ein Verzeichnis finden, das bestimmte Namensübereinstimmungen ausschließt?

So etwas in MySQL select * from folder where filename != '0021bc'

Egy Mohammad Erdin
quelle

Antworten:

9

Verwenden Sie !in einem findBefehl, um die folgende Option zu negieren (invertieren). In Ihrem Fall:

find . ! -iname "002abc*"

und optional nur passende Ordner:

find . ! -iname "002abc*" -type d

listet alle Ordner mit Ausnahme der Ordner auf, die dem Muster entsprechen 002abc*.

Das !kann beim Shell-Scripting manchmal problematisch sein, daher ist der Parameter , wie Flimm betonte , -notein sehr nützliches Synonym dafür.

gertvdijk
quelle
3
Ein Synonym für !ist -notwie folgt :find . -not -iname "002abc*"
Flimm
Falls sich jemand wundert, können Sie die Flags kombinieren, um so etwas wie Folgendes zu erzeugen: Hier find -L . -name '*.php' ! -name 'vendor/*.php' -print0werden alle PHP-Dateien gefunden, die sich NICHT in einem Herstellerordner befinden
Craig Wayne
1

Sie können "alle" Ordner finden und dann den auswählen, mit dem Sie nicht möchten grep -v(oder egrep für diese Angelegenheit).

find . -iname "abc*" | grep -v 002

Wenn Sie mehr als einen Namen auswählen möchten, können Sie die sequentielle grep -v- oder eine egrep-Anweisung verwenden.

find . -iname "abc*" | grep -v 002 | grep -v 003

oder

find . -iname "abc*" | egrep -v "002|003"

Sie müssen es auf das einstellen, was Sie wollen, und ich bin froh, es wiederholen zu können. Wenn Sie die Manpage zum Suchen lesen, finden Sie auch viele Flags zum Sortieren nach Dateien und Ordnern.

Philshem
quelle
1
find -name 0021bc -prune -o -print
Steven Penny
quelle