
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 ls
ist 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 zsh
zusätzlich folgendes setzen :nullglob
setopt nullglob
oder fügen Sie N
dem Muster alternativ einen Glob-Qualifizierer hinzu:
for file in /path/{.,}*(N); do echo "$file"; done