Wie filtere ich einen Glob in zsh?

7

Grundsätzlich kann ich einen Glob in zsh für eine Liste verwenden. Oft stellt sich heraus, dass ich diese Liste filtern möchte, aber ich frage mich leider, ob ich das tun muss.

Hat zsh eine Methode zum Filtern einer Liste? Ich fürchte, dies ist eine offensichtliche Frage, aber mental ist es heute ein Tag mit geringen Erträgen.

kichernd
quelle

Antworten:

14

Dies ist eine seltsame Frage, da zsh die einzige Shell mit dieser Funktion ist. Es heißt Glob Qualifiers . Das Handbuch ist wie üblich eher knapp und ohne Beispiele. Die Zsh-Liebhaberseite enthält einige Beispiele. Beim Googelnzsh "glob qualifiers" werden einige Blog-Beiträge und Tutorials angezeigt . Sie können auch "glob qualifier"auf dieser Site suchen .

Die Grundlagen: Glob-Qualifikationsmerkmale stehen am Ende des Globs in Klammern. Am nützlichsten sind die Satzzeichen, um nur bestimmte Dateitypen auszuwählen.

echo *(/)      # directories
echo *(.)      # regular files
echo *(@)      # symbolic links
echo *(-/)     # directories and symbolic links to directories

Es gibt andere Qualifikationsmerkmale, die nach Metadaten wie Größe, Datum und Besitz gefiltert werden können.

# files owned by the user running zsh, over 1MB, last modified more than 7 days ago
echo *(ULm+1m+7)

Glob-Qualifikanten können auch die Reihenfolge der Übereinstimmungen steuern und die Anzahl der Übereinstimmungen einschränken.

echo *(Om[1,10])     # The 10 oldest files

Sie können beliebige Filter einrichten, indem Sie eine Funktion mit dem +Qualifizierer aufrufen (Sie können den Code sogar in den eQualifizierer einfügen , wenn Ihnen das schwierige Zitieren nichts ausmacht).

Beachten Sie, dass dies leider nur bei Globs funktioniert. Wenn Sie auf diese Weise eine Liste von Dateinamen erstellen möchten, müssen Sie beim Globbing filtern. Wenn Sie eine Liste filtern möchten, die Sie bereits erstellt haben, gibt es eine völlig andere Syntax, Parametererweiterungsflags , die nur eine einfache Textfilterung durchführen können ( "${(@)ARRAY:#PATTERN}").

Gilles 'SO - hör auf böse zu sein'
quelle
2
Mit dieser EXTENDED_GLOBOption können Sie auch die Operatoren^x und x~y glob für Pfadnamen-basierte Ausschlüsse beim Globbing (à la grep -v) verwenden.
Chris Johnsen
Parametererweiterung war das Ding. Vielen Dank für die absolut vollständige Antwort. Geschätzt.
Chiggsy