richtige Art und Weise durch Inhalte in einem Verzeichnis zu iterieren

richtige Art und Weise durch Inhalte in einem Verzeichnis zu iterieren

Ich muss jede Datei in einem Verzeichnis durchlaufen. Eine häufige Methode, die ich gesehen habe, war die Verwendung einer For-Schleife, die mit beginnt for file in *; do. Mir ist jedoch aufgefallen, dass sie keine versteckten Dateien (Dateien, die mit einem „.“ beginnen) einschließt. Die andere offensichtliche Methode ist, dann etwas wie Folgendes zu tun:

for file in `ls -a`; do

Das Durchlaufen lsist jedoch keine gute Idee, da Leerzeichen in Dateinamen alles durcheinander bringen. Was wäre der richtige Weg, um durch ein Verzeichnis zu iterieren und auch alle versteckten Dateien abzurufen?

Antwort1

Sie müssen lediglich eine Liste mit durch Leerzeichen getrennten Glob-Matching-Dateien erstellen:

for file in .* *; do echo "$file"; done

Bearbeiten

Das Obige kann durch Klammererweiterung in eine andere Form umgeschrieben werden

 for file in {.*,*}; do echo "$file"; done

oder noch kürzer:for file in {.,}*; do echo "$file"; done

Hinzufügen des Pfads für ausgewählte Dateien:

 for file in /path/{..?,.[!.],}*; do echo "$file"; done

Pfad für ausgewählte Dateien hinzufügen:

 for file in /path/{.,}*; do echo "$file"; done

Wenn Sie es anspruchsvoll mögen, entfernen Sie aus der Liste normalerweise nicht benötigte Elemente .und ..ändern Sie sie einfach {.,}*in {..?,.[!.],}*.

Der Vollständigkeit halber sei erwähnt, dass man dotglob auch so einstellen kann, dass Dot-Dateien mit reinem übereinstimmen *.

shopt -s dotglob

Um den Fehler bei No-Matches zu verhindern, muss man zshzusätzlich folgendes setzen :nullglob

setopt nullglob

oder fügen Sie Ndem Muster alternativ einen Glob-Qualifizierer hinzu:

for file in /path/{.,}*(N); do echo "$file"; done

verwandte Informationen