Das ls
kann 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.repo
,CentOS-Debuginfo.repo
und CentOS-Vault.repo
doch nicht CentOS-Media.repo
. Also führe ich diesen Befehl aus
ls [^\(Media\)]
Ich erhalte jedoch eine Fehlermeldung. Wie soll ich vorgehen?
Antworten:
Im einfachsten Fall können Sie Folgendes verwenden (falls das erste Unterwort statisch ist
CentOS
):[BDV]
- Zeichenklasse, um sicherzustellen, dass das zweite Unterwort mit einem der angegebenen Zeichen beginntoder dasselbe mit Verneinung :
Wenn Sie alle Dateinamen ignorieren möchten, die das
M
Zeichen enthalten , verwenden Sie bei der GNU-Implementierung vonls
(wie normalerweise bei CentOS zu finden) die Option-I
(--ignore
):So ignorieren Sie Einträge mit
Media
Word:Diese Muster müssen wörtlich übergeben und in
ls
Anführungszeichen gesetzt werden (andernfalls würde die Shell sie als Globs zum Erweitern behandeln).quelle
ls *[^M]*
?ls CentOS-[^M]*
Arbeit, aber diels *[^M]*
nicht ..M
Zeichenvorkommen ODERMedia
Wort?M
.Einige Shells haben Negations-Globbing-Operatoren:
zsh -o extendedglob
:ksh
,zsh -o kshglob
,bash -O extglob
:bash
:ksh
:quelle
Eine Option ist die Verwendung
find
mit den-not -name
Flags. D. hfind . -not -name CentOS-Media.repo
. Wenn Sie die Verzeichnisstruktur nicht zurückverfolgen möchten, fügen Sie-maxdepth 1
flag hinzu.Alternativ kann man auch Folgendes schreiben (was viel komplexer ist, aber ich habe
-not
flag 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. Hoffentlichgrep
unterstü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'
quelle
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-E
fü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.Am einfachsten ist es, find zu verwenden. Tun:
Hier „f“ Mittel für die Suche regulärer Dateien nur (ausgenommen Symlinks zu regulären Dateien obwohl, mit GNU
find
, verwendet-xtype f
stattdessen enthalten sie). Wenn Sie nach Verzeichnissen suchen möchten, übergeben Sie stattdessen "d".(
-maxdepth
Während anfangs eine GNU-Erweiterung mittlerweile weit verbreitet ist. Wenn Siefind
sie nicht unterstützen, können Sie sie durch-maxdepth 1
den Standard ersetzen! -name . -prune
.)siehe find man - Seite für mehr awesome Funktionen.
quelle