Richtige Methode zum Durchlaufen von Inhalten in einem Verzeichnis [Duplikat]

Diese Frage hat hier bereits Antworten :

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 Sie setopt 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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.