Ich möchte über jede Zeile in der Ausgabe von: iterieren. ls -l /some/dir/*
Im Moment versuche ich: for x in $(ls -l $1); do echo $x; done
Dies iteriert jedoch über jedes Element in der Zeile separat, sodass ich Folgendes erhalte:
-r--r-----
1
ivanevf
eng
1074
Apr
22
13:07
File1
-r--r-----
1
ivanevf
eng
1074
Apr
22
13:17
File2
Ich möchte jedoch jede Zeile als Ganzes durchlaufen. Wie mache ich das?
Antworten:
Stellen Sie IFS wie folgt auf newline ein:
Legen Sie eine Sub-Shell darum, wenn Sie IFS nicht dauerhaft festlegen möchten:
Oder verwenden Sie while | Lesen Sie stattdessen:
Eine weitere Option, mit der while / read auf derselben Shell-Ebene ausgeführt wird:
quelle
read -r
oder Bash entfernt nicht entkoppelte Backslashes aus den Daten.Es hängt davon ab, was Sie mit jeder Zeile tun möchten. awk ist ein nützliches Dienstprogramm für diese Art der Verarbeitung. Beispiel:
.. druckt auf meinem System den Namen und die Größe jedes Elements im Verzeichnis.
quelle
Wie bereits erwähnt, ist awk das richtige Werkzeug dafür. Wenn Sie awk nicht verwenden möchten, anstatt die Ausgabe von "ls -l" Zeile für Zeile zu analysieren, können Sie alle Dateien durchlaufen und für jede einzelne Datei ein "ls -l" wie folgt ausführen:
quelle
Sie können den
find
Befehl auch ausprobieren . Wenn Sie nur Dateien im aktuellen Verzeichnis möchten:Führen Sie einen Befehl für jeden von ihnen aus?
Zeilen zählen, aber nur in Dateien?
quelle
Das Dienstprogramm read (1) und die Ausgabeumleitung des Befehls ls (1) machen das, was Sie wollen.
quelle
Warum hat niemand vorgeschlagen, nur Optionen zu verwenden, die die Teile eliminieren, die er nicht verarbeiten möchte?
Auf dem modernen Debian erhalten Sie einfach Ihre Datei mit:
Außerdem müssen Sie nicht darauf achten, in welchem Verzeichnis Sie es ausführen, wenn Sie das vollständige Verzeichnis verwenden:
Diesen letzten Befehl verwende ich oben und erhalte die folgende Ausgabe:
quelle