Antworten:
lsfü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. printfzum 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, -dweil, wenn eine dieser Dateien vom Typ Verzeichnis ist , lsihren Inhalt sonst auflisten würde).
Oder um sie unzipzu extrahieren, wenn nur unzipmehr als eine Datei gleichzeitig extrahiert werden könnte. Leider ist dies nicht der Fall, sodass Sie entweder xargs -n1eine forSchleife 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 unzipes jedoch eher wie ein Port eines MS-DOS-Befehls sein, unzipselbst 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*.zipMuster entsprechen. Sie möchten also tatsächlich:
unzip 'abc*.zip'
(Tatsächlich wäre unser xargsund der forobige Ansatz falsch, denn wenn es eine Datei gibt, die abc*.zipzum Beispiel aufgerufen wird , unzipwürde sie als Muster behandelt! bsdtarWeitere unixy Möglichkeiten zum Extrahieren von zipArchiven 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 abcTeil 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 bashoben.
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 findImplementierungen können Sie auch -inameanstelle der -nameSuche ohne Berücksichtigung der Groß- und Kleinschreibung verwenden ( aBc<date>.ZIPwü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 -ifür die Suche ohne Berücksichtigung der Groß- und Kleinschreibung.
execve()Systemaufruf.
finddiese Dateien auch in Unterverzeichnissen gesucht werden. Verwenden Sie find . ! -name . -prune -name 'abc*.zip' -printoder, find . -maxdepth 1 -name 'abc*.zip'wenn Ihre findUnterstützung -maxdepthauf GNU oder BSD gefällt oder find . -depth 1 -name 'abc*.zip'wenn Ihre findUnterstützung -depth <n>auf einigen BSDs ähnlich ist, um sie auf das aktuelle Verzeichnis zu beschränken.
$ ls ../*.aarbeitete für mich (Listenarchive im übergeordneten Verzeichnis).
Sie müssen das Verzeichnis angeben, in dem lsin 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
abcund mit enden .zip.
ls -1 | grep "abc$(your_date).zip"?