Einfache Unix-Art, die Schleife durch Leerzeichen getrennte strings?
Habe ich eine Datei namens file_list
mit Leerzeichen getrennte strings, die jeweils einen Namen einer Datei verarbeitet werden. Jetzt will ich eine Schleife durch alle Dateinamen und verarbeiten Sie eins nach dem anderen. Pseudocode ist
for every filename in file_list
process(filename);
end
Habe ich eine etwas ungeschickte Lösung, die
- laden Sie die Datei in eine variable durch
filenames='cat file_list'
- die Anzahl der Räume,
N
durchtr -cd ' ' <temp_list | wc -c
- Schleife von 1 bis
N
und analysieren von Speicherplatz die einzelnen Dateinamen mitcut
Gibt es einen einfacheren/eleganteren Weg dies zu tun?
- Haben Sie versucht, die
for fname in $file_list
? Welche shell benutzt du? - Nein, habe ich nicht. Wird, dass die Arbeit? (ein bisschen überrascht, dass es so einfach ist) ich bin mit der bash.
- Es funktioniert tatsächlich! Vielen Dank! Schockiert über meine stupidness.. LOL
for fname in $file_list
sollte nicht Arbeit: das Schleifen über den Namen in der variable$file_name
. Aber in Ihrer Frage, die Sie sagte, war es nicht eine variable, sondern der name einer Datei.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der einfachste Weg dies zu tun ist ein klassischer trick, der in der bourne-shell für eine Weile.
[1]
im Namen können auch Probleme verursachen, zum Beispiel. Und ja, als ich bearbeitete meinen Kommentar zu sagen in diesem Fall, die Lösung ist sicherer als in anderen, denn das Hauptproblem ist eigentlich das beabsichtigte Verhalten aber der rest sind noch möglich.for filename in $(< file_list)
Können Sie die Datei ändern zu müssen Worte sein, die Linie getrennt, statt durch ein Leerzeichen getrennt. Auf diese Weise können Sie die typische syntax:
Mit
tr ' ' '\n' < file
Sie ersetzen Räume mit neuen Leitungen, so dass diese machen sollte:Test
tr
. Verwendung von arrays statt. Da Sie über Prozess-substitution es ist davon auszugehen, dass die shell "bash".while IFS= read -ra filename; do printf "file -- %s\n" ${filename[@]}; done < a