So finden Sie alle Dateien mit Ausnahme einer angegebenen Datei

13

Das lskann so ein Ergebnis ergeben

[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# ls

CentOS-Base.repo CentOS-Debuginfo.repo CentOS-Media.repo CentOS-Vault.repo

Aber eigentlich hoffe ich es nur herauszufinden CentOS-Base.repoCentOS-Debuginfo.repound CentOS-Vault.repodoch nicht CentOS-Media.repo. Also führe ich diesen Befehl aus

ls [^\(Media\)]

Ich erhalte jedoch eine Fehlermeldung. Wie soll ich vorgehen?

yode
quelle
@steeldriver Vielen Dank für Ihren Link, das ist sehr nützlich für mich ..
Yode
Sie könnten erwägen, Ihre Shell auf zsh
umzustellen

Antworten:

10

Im einfachsten Fall können Sie Folgendes verwenden (falls das erste Unterwort statisch ist CentOS):

ls CentOS-[BDV]*

  • [BDV] - Zeichenklasse, um sicherzustellen, dass das zweite Unterwort mit einem der angegebenen Zeichen beginnt

oder dasselbe mit Verneinung :

ls CentOS-[^M]*

Wenn Sie alle Dateinamen ignorieren möchten, die das MZeichen enthalten , verwenden Sie bei der GNU-Implementierung von ls(wie normalerweise bei CentOS zu finden) die Option -I( --ignore):

ls -I '*M*'

-I, --ignore = PATTERN listet
keine impliziten Einträge auf, die mit der Shell PATTERN übereinstimmen

So ignorieren Sie Einträge mit MediaWord:

ls -I '*Media*'

Diese Muster müssen wörtlich übergeben und in lsAnführungszeichen gesetzt werden (andernfalls würde die Shell sie als Globs zum Erweitern behandeln).

RomanPerekhrest
quelle
Warum wir ls *[^M]*
yode am
Die ls CentOS-[^M]*Arbeit, aber die ls *[^M]*nicht ..
yode
@yode, hängt davon ab, was genau Sie ignorieren möchten: MZeichenvorkommen ODER MediaWort?
RomanPerekhrest
Aber in meinem Fall hat nur diese Datei einen Charakter M.
Yode
3
Die Muster sind gierig: Das erste * stimmt mit Ausnahme des letzten Buchstabens mit allem überein, das [^ M] mit dem letzten Buchstaben, da keines mit M endet und das nachfolgende * mit der leeren Zeichenfolge übereinstimmt. Also passen sie alle zusammen. Und selbst wenn etwas mit M endet, würde es immer noch übereinstimmen, vorausgesetzt, es gäbe irgendwo etwas anderes als M: Wenn Sie beispielsweise eine Datei mit dem Namen OOM hätten, würde der erste Stern mit dem ersten O übereinstimmen, das [^ M] würde mit dem zweiten O übereinstimmen und der Schleppstart würde mit dem M.
NickD
12

Einige Shells haben Negations-Globbing-Operatoren:

  • zsh -o extendedglob:

    ls -d -- ^*Media*
    ls -d -- *.repo~*Media* # ~ is "except" operator
    
  • ksh, zsh -o kshglob, bash -O extglob:

    ls -d -- !(*Media*)
    
  • bash:

    GLOBIGNORE='*Media*'
    ls -d -- *
    
  • ksh:

    FIGNORE='@(*Media|.)*'
    ls -d -- *
    
Stéphane Chazelas
quelle
6

Eine Option ist die Verwendung findmit den -not -name Flags. D. h find . -not -name CentOS-Media.repo. Wenn Sie die Verzeichnisstruktur nicht zurückverfolgen möchten, fügen Sie -maxdepth 1flag hinzu.

Alternativ kann man auch Folgendes schreiben (was viel komplexer ist, aber ich habe -notflag vergessen und diese Antwort ursprünglich gepostet, sodass ich diesen Teil nicht löschen werde):

find . -print0 | grep --invert-match -z "CentOS-Media.repo$" | tr '\0' '\n'

Sie müssen erzwingen find, Dateinamen mit Null-Byte zu trennen, damit Zeilenumbrüche in Dateinamen keine Aufschlüsselung bewirken. Hoffentlich grepunterstützt diese Art von Separator mit Flag -z. Möglicherweise möchten Sie zur typischen Trennung (dh Null-Byte -> neue Zeile) mit zurückkehrentr '\0' '\n'

Styroporfliege
quelle
1
Sie können auch durch printf '%s\0' *Nullen getrennte Dateinamen erhalten, die nicht wiederkehren und standardmäßig keine Punktedateien enthalten (für einige Shells gibt es jedoch eine Option). Sie auch nicht brauchen -Efür diese regexp, aber wählerisch sein Sie entweder den Backslash sollte .oder legen Sie sie in [], und Sie tun , hängt von GNU finden und grep.
Dave_thompson_085
4

Am einfachsten ist es, find zu verwenden. Tun:

find . -maxdepth 1 -type f ! -name "CentOS-Media.repo"

Hier „f“ Mittel für die Suche regulärer Dateien nur (ausgenommen Symlinks zu regulären Dateien obwohl, mit GNU find, verwendet -xtype fstattdessen enthalten sie). Wenn Sie nach Verzeichnissen suchen möchten, übergeben Sie stattdessen "d".

( -maxdepthWährend anfangs eine GNU-Erweiterung mittlerweile weit verbreitet ist. Wenn Sie findsie nicht unterstützen, können Sie sie durch -maxdepth 1den Standard ersetzen ! -name . -prune.)

siehe find man - Seite für mehr awesome Funktionen.

Al 123
quelle