(6 Antworten)
Vor 3 Jahren geschlossen.
Ich habe ein Skript, das einen Index basierend auf jeder Datei in einem Ordner generiert. Alle Dateinamen sind eine Zahl mit Erweiterung.
Wie kann ich meine Schleife ändern, um sie in numerischer Reihenfolge zu verarbeiten?
for file in xml/*.xml; do
...
done
Akzeptierte Antwort:
Wenn Sie GNU sort
haben das hat die Möglichkeit, den \0
zu begrenzen Trennzeichen, das Sie tun können. Auf diese Weise das while
Schleife beginnt, Dateien in der sortierten Reihenfolge abzurufen, damit Sie sie verarbeiten können. Ersetzen Sie printf
Option mit Ihrer eigenen benutzerdefinierten Logik.
shopt -s nullglob
printf '%s\0' xml/*.xml | sort -zV | while read -rd '' file; do
printf "%s\n" "$file"
done
shopt -u nullglob
Der nullglob
Die Option soll verhindern, dass die Shell einen leeren Glob erweitert, wenn kein xml
vorhanden ist Dateien befinden sich im aktuellen Ordner. Die Option -u
setzt es zurück, nachdem Ihre Verarbeitung abgeschlossen ist.
Wie Tony Speight zu Recht betont, können Sie, wenn Sie nicht mit den Shell-Optionen herumspielen wollen (z. B. wenn sie aus anderen Gründen aktiviert sind), einfach die Sub-Shell einrichten und die Glob-Erweiterung durchführen lassen
( shopt -s nullglob; printf '%s\0' xml/*.xml ) | sort -zV | while read -rd '' file; do
printf "%s\n" "$file"
done