Antworten:
ls
führt keinen Mustervergleich für Dateinamen durch. Es werden nur der Inhalt der Verzeichnisse und die Dateien aufgelistet, die als Argumente angegeben werden.
Ihre Shell hingegen verfügt über eine Funktion namens Globbing oder Dateinamengenerierung , die ein Muster in eine Liste von Dateien erweitert, die diesem Muster entsprechen.
Hier wäre dieses Glob-Muster abc*.zip
( *
ein Platzhalter, der für eine beliebige Anzahl von Zeichen steht ).
Sie können es an einen beliebigen Befehl übergeben, z. B. printf
zum Drucken:
printf '%s\n' abc*.zip
Sie können es auch übergeben ls -l
, um die Attribute dieser Dateien anzuzeigen:
ls -ld abc*.zip
(Wir brauchen, -d
weil, wenn eine dieser Dateien vom Typ Verzeichnis ist , ls
ihren Inhalt sonst auflisten würde).
Oder um sie unzip
zu extrahieren, wenn nur unzip
mehr als eine Datei gleichzeitig extrahiert werden könnte. Leider ist dies nicht der Fall, sodass Sie entweder xargs -n1
eine for
Schleife oder eine Schleife verwenden müssen:
printf '%s\0' abc*.zip | xargs -r0n1 unzip
Oder:
for file in abc*.zip; do unzip "$file"; done
Tatsächlich würde unzip
es jedoch eher wie ein Port eines MS-DOS-Befehls sein, unzip
selbst sein Argument als Glob zu behandeln. Mit anderen Worten, unzip 'abc*.zip'
entpackt nicht die aufgerufene Datei abc*.zip
(ein perfekt gültiger Dateiname unter Unix, nicht unter Microsoft-Betriebssystemen), sondern die Dateien, die dem abc*.zip
Muster entsprechen. Sie möchten also tatsächlich:
unzip 'abc*.zip'
(Tatsächlich wäre unser xargs
und der for
obige Ansatz falsch, denn wenn es eine Datei gibt, die abc*.zip
zum Beispiel aufgerufen wird , unzip
würde sie als Muster behandelt! bsdtar
Weitere unixy Möglichkeiten zum Extrahieren von zip
Archiven finden Sie hier.)
Für eine Übereinstimmung ohne [aA][bB][cC]*.[zZ][iI][pP]
Berücksichtigung der Groß- und Kleinschreibung würden Sie portabel verwenden. Einige Shells verfügen über erweiterte Globbing-Operatoren für die Anpassung der Groß- und Kleinschreibung:
zsh
::
setopt extendedglob
ls -ld (#i)abc*.zip
Oder:
ls -ld ((#i)abc)*.zip
Wenn Sie nur möchten, dass das abc
Teil nicht zwischen Groß- und Kleinschreibung unterscheidet.
ksh93
::
ls -ld ~(i)abc*.zip
oder:
ls -ld ~(i:abc)*.zip
mit bash
.
shopt -s nocaseglob
ls -ld abc*.zip
(Keine andere Möglichkeit, nur Teile der Globs zwischen Groß- und Kleinschreibung zu unterscheiden, als die tragbare Syntax zu verwenden).
mit yash
:
set +o case-glob
ls -ld abc*.zip
gleiche Bemerkung wie bash
oben.
ls abc*.zip
Dies schlägt jedoch fehl, wenn zu viele Dateien vorhanden sind (die Shell-Erweiterung ist hinsichtlich der Anzahl der Argumente, auf die sie erweitert werden kann, begrenzt).
find . -name "abc*.zip"
Dies ist wahrscheinlich die universellste. Die Zitate müssen da sein. Bei einigen find
Implementierungen können Sie auch -iname
anstelle der -name
Suche ohne Berücksichtigung der Groß- und Kleinschreibung verwenden ( aBc<date>.ZIP
würde auch übereinstimmen).
ls | grep -x "abc.*\.zip"
Mind the .*
und \.
da die Filter grep regex Verwendungen ist , die aus der Wildcard - Notation der Schalen Verwendungen für Expansion unterscheiden. Verwenden Sie diese Option grep -i
für die Suche ohne Berücksichtigung der Groß- und Kleinschreibung.
execve()
Systemaufruf.
find
diese Dateien auch in Unterverzeichnissen gesucht werden. Verwenden Sie find . ! -name . -prune -name 'abc*.zip' -print
oder, find . -maxdepth 1 -name 'abc*.zip'
wenn Ihre find
Unterstützung -maxdepth
auf GNU oder BSD gefällt oder find . -depth 1 -name 'abc*.zip'
wenn Ihre find
Unterstützung -depth <n>
auf einigen BSDs ähnlich ist, um sie auf das aktuelle Verzeichnis zu beschränken.
$ ls ../*.a
arbeitete für mich (Listenarchive im übergeordneten Verzeichnis).
Sie müssen das Verzeichnis angeben, in dem ls
in einem Beispiel gesucht werden soll
ls -la ~/file*.*
ls -la ./file*.*
es funktioniert für mich, aber offensichtlich unterstützt es nicht die Suche nach Mustern
abc
und mit enden .zip
.
ls -1 | grep "abc$(your_date).zip"
?