Weil, wie Sie sagen, der Eingang file
hat seinen Dateinamen . Die Ausgabe von ls
ist jedoch nur Text. Dass es sich zufällig um eine Liste von Dateinamen handelt, ändert nichts an der Tatsache, dass es sich lediglich um Text handelt und nicht um den Speicherort von Dateien auf der Festplatte.
Wenn Sie die Ausgabe auf dem Bildschirm sehen, sehen Sie Text. Ob dieser Text ein Gedicht oder eine Liste von Dateinamen ist, spielt für den Computer keine Rolle. Alles was es weiß ist, dass es Text ist. Aus diesem Grund können Sie die Ausgabe von ls
an Programme übergeben, die Text als Eingabe verwenden (obwohl Sie dies wirklich, wirklich nicht tun sollten ):
$ ls / | grep etc
etc
Um die Ausgabe eines Befehls zu verwenden, der Dateinamen als Text (z. B. ls
oder find
) als Eingabe für einen Befehl auflistet , der Dateinamen akzeptiert, müssen Sie einige Tricks anwenden. Das typische Werkzeug dafür ist xargs
:
$ ls
file1 file2
$ ls | xargs wc
9 9 38 file1
5 5 20 file2
14 14 58 total
Wie ich bereits sagte, möchten Sie die Ausgabe von nicht wirklich analysieren ls
. Etwas wie find
ist besser (das gibt nach jedem Dateinamen print0
ein \0
statt eines neuen aus und das -0
von xargs
lässt es mit solchen Eingaben umgehen; dies ist ein Trick, damit Ihre Befehle mit Dateinamen funktionieren, die Zeilenumbrüche enthalten):
$ find . -type f -print0 | xargs -0 wc
9 9 38 ./file1
5 5 20 ./file2
14 14 58 total
Welches hat auch seine eigene Art, dies zu tun, ohne überhaupt zu brauchen xargs
:
$ find . -type f -exec wc {} +
9 9 38 ./file1
5 5 20 ./file2
14 14 58 total
Schließlich können Sie auch eine Shell-Schleife verwenden. Beachten Sie jedoch, dass dies in den meisten Fällen xargs
viel schneller und effizienter ist. Beispielsweise:
$ for file in *; do wc "$file"; done
9 9 38 file1
5 5 20 file2
ls
, bedeutet dies, dass alle Dateien im aktuellen Verzeichnis mit demfile
Befehl verarbeitet werden sollen. ... Warum also nicht einfach machenfile *
:, das mit einer Zeile für jede Datei, Ordner antwortet.