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 gotglob
ist 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
zsh
Fehler zurückgibt, wenn ein Muster-Nr Streichhölzer. Um dies zu verhindern, führen Siesetopt nullglob
aus, 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
.