Weil, wie Sie sagen, der Eingang filehat seinen Dateinamen . Die Ausgabe von lsist 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 lsan 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. lsoder 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 findist besser (das gibt nach jedem Dateinamen print0ein \0statt eines neuen aus und das -0von xargslä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 xargsviel 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 demfileBefehl verarbeitet werden sollen. ... Warum also nicht einfach machenfile *:, das mit einer Zeile für jede Datei, Ordner antwortet.