Der for
-loop iteriert über jeden (durch Leerzeichen getrennten) Eintrag in der angegebenen Zeichenfolge.
Sie führen den find
nicht wirklich aus Befehl, aber geben Sie an, dass es sich um eine Zeichenfolge handelt (die von for
iteriert wird -loop).Anstelle der doppelten Anführungszeichen verwenden Sie entweder Backticks oder $()
:
for line in $(find . -iname '*.txt'); do
echo "$line"
ls -l "$line"
done
Außerdem schlägt diese Methode fehl, wenn Ihre Dateipfade/-namen Leerzeichen enthalten (da die Datei for
-loop iteriert über durch Leerzeichen getrennte Einträge). Stattdessen ist es besser, die in der Antwort von Dogbanes beschriebene Methode zu verwenden.
Um Ihren Fehler zu klären:
Wie gesagt, for line in "find . -iname '*.txt'";
iteriert über alle durch Leerzeichen getrennten Einträge, die sind:
- finden
- .
- -iname
- '*.txt' (glaube ich...)
Die ersten beiden führen nicht zu einem Fehler (abgesehen vom unerwünschten Verhalten), aber der dritte ist problematisch, da er ausgeführt wird:
ls -l -iname
Viele (Bash-)Befehle können einzelne Zeichenoptionen kombinieren, also -iname
ist dasselbe wie -i -n -a -m -e
. Und voila:Ihr invalid option -- 'e'
Fehler!
Hier ist eine bessere Möglichkeit, Dateien zu durchlaufen, da Leerzeichen und Zeilenumbrüche in Dateinamen behandelt werden:
#!/bin/bash
find . -type f -iname "*.txt" -print0 | while IFS= read -r -d $'\0' line; do
echo "$line"
ls -l "$line"
done
Verwenden Sie die Befehlsersetzung anstelle von Anführungszeichen, um find auszuführen, anstatt den Befehl als Zeichenfolge zu übergeben:
for line in $(find . -iname '*.txt'); do
echo $line
ls -l $line;
done
Kompaktere Version, die mit Leerzeichen und Zeilenumbrüchen im Dateinamen arbeitet:
find . -iname '*.txt' -exec sh -c 'echo "{}" ; ls -l "{}"' \;