Auflisten von Dateien mit Muster mit Start und Ende

9

Ich möchte alle Dateien in einem Verzeichnis auflisten, die mit 'abc' beginnen und mit '.zip' enden.

Ich versuche zu benutzen ls.

Das Verzeichnis enthält viele Zip-Dateien, die mit abc<date>und beginnen xvz<date>. Ich möchte nur die Liste der bekommenabc<date>.zip

unix_dude
quelle
ls -1 | grep "abc$(your_date).zip" ?
Stan Strum

Antworten:

15

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.

Stéphane Chazelas
quelle
9
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.

Jan Dusek
quelle
1
Beachten Sie, dass dieses Limit kein Shell-Limit ist. Es ist ein Kernel-Limit im execve()Systemaufruf.
Stéphane Chazelas
Es sollte wahrscheinlich beachtet werden, dass 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.
Stéphane Chazelas
$ ls ../*.aarbeitete für mich (Listenarchive im übergeordneten Verzeichnis).
Daniel
0

Versuchen Sie ls abc*.zip, die Ergebnisse auf diejenigen einzugrenzen, die Ihren Kriterien für eine Startzeichenfolge von abc und eine Endung von .zip entsprechen. Das Sternchen wird erweitert, um diesen Ergebnissen zu entsprechen, ohne xvz-Startzeichen einzuschließen.

Jeff
quelle
-1

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

Kevin Montalvo
quelle
1
Dies geht nicht auf die Frage ein; Die Dateien sollten mit beginnen abcund mit enden .zip.
Jeff Schaller