for -loop bude iterovat přes každý záznam (oddělený mezerou) na zadaném řetězci.
Ve skutečnosti nespustíte find příkaz, ale poskytněte jej jako řetězec (který se iteruje pomocí for -loop).Namísto dvojitých uvozovek použijte buď zpětné zaškrtnutí nebo $() :
for line in $(find . -iname '*.txt'); do
echo "$line"
ls -l "$line"
done
Navíc, pokud cesty/názvy souborů obsahují mezery, tato metoda selže (protože for -loop iteruje přes položky oddělené mezerou). Místo toho je lepší použít metodu popsanou v odpovědi dogbanes.
Pro objasnění vaší chyby:
Jak bylo řečeno, for line in "find . -iname '*.txt'"; iteruje přes všechny položky oddělené mezerou, což jsou:
- najít
- .
- -jméno
- '*.txt' (myslím...)
První dvě nevedou k chybě (kromě nežádoucího chování), ale třetí je problematická, protože se provádí:
ls -l -iname
Mnoho (bash) příkazů může kombinovat volby jednoho znaku, takže -iname je stejný jako -i -n -a -m -e . A voila:vaše invalid option -- 'e' chyba!
Zde je lepší způsob, jak procházet soubory, protože zpracovává mezery a nové řádky v názvech souborů:
#!/bin/bash
find . -type f -iname "*.txt" -print0 | while IFS= read -r -d $'\0' line; do
echo "$line"
ls -l "$line"
done
Použijte nahrazení příkazu místo uvozovek k provedení find namísto předání příkazu jako řetězce:
for line in $(find . -iname '*.txt'); do
echo $line
ls -l $line;
done
Kompaktnější verze pracující s mezerami a novými řádky v názvu souboru:
find . -iname '*.txt' -exec sh -c 'echo "{}" ; ls -l "{}"' \;