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 "{}"' \;