Antwort
Sie brauchen nur So erstellen Sie eine Liste von Glob-Matching-Dateien, die durch Leerzeichen getrennt sind:
for file in .* *; do echo "$file"; done
Bearbeiten
Das obige kann mit Klammererweiterung
for file in {.*,*}; do echo "$file"; done
oder sogar kürzer in anderer Form umgeschrieben werden : for file in {.,}*; do echo "$file"; done
Hinzufügen des Pfads für ausgewählte Dateien:
for file in /path/{..?,.[!.],}*; do echo "$file"; done
Hinzufügen eines Pfads für ausgewählte Dateien:
for file in /path/{.,}*; do echo "$file"; done
Wenn Sie anspruchsvoll sein und aus der Liste entfernen möchten, die normalerweise nicht benötigt wird . und
Ändern Sie einfach {.,}* in {..?,.[!.],}*.
Der Vollständigkeit halber lohnt es sich um zu erwähnen, dass man dotglob auch so einstellen kann, dass Punktdateien mit reinem * übereinstimmen.
shopt -s dotglob
In zsh muss zusätzlich nullglob gesetzt werden, um den Fehler bei Nichtübereinstimmungen zu vermeiden:
setopt nullglob
oder alternativ das Glob-Qualifikationsmerkmal N zum Muster hinzufügen:
for file in /path/{.,}*(N); do echo "$file"; done
Kommentare
- Vielen Dank! Wenn ich also ein Verzeichnis durchlaufen möchte, setze ich einfach den Verzeichnisnamen vor jedes der Elemente, oder? wie
for file in dir/.* dir/*; do - Es ist ' nicht so einfach.
.*stimmt mit.und..überein (außer in zsh).*bleibt*, wenn keine übereinstimmende Datei vorhanden ist.shopt -s gotglobist nur in Bash. - Ich erhalte
zsh: no matches found: .*, wenn ich die Befehle in dieser Antwort ausführe . Warum sollte das passieren? Im Verzeichnis werden die Dateien angezeigt. - @Niyaz, dass ' s, weil
zshFehler zurückgibt, wenn ein Muster-Nr Streichhölzer. Um dies zu verhindern, führen Siesetopt nullglobaus, wodurch diese Funktion global deaktiviert wird, oder fügen Sie nach dem Glob-Stern das Qualifikationsmerkmal(N)hinzu, dh:for file in /path/{.,}*(N); do echo "$file"; done.