The for
-loop będzie iterować po każdym (oddzielonym spacjami) wpisie na podanym łańcuchu.
Nie wykonujesz komendy find
, ale podajesz ją jako ciąg (który jest iterowany przez for
-loop). Zamiast cudzysłów użyć albo odwrócone, pojedyncze apostrofy lub $()
:
for line in $(find . -iname '*.txt'); do
echo "$line"
ls -l "$line"
done
Ponadto, jeśli ścieżki dostępu do plików/nazwiska zawiera spacje ta metoda zawiedzie (od for
-loop iteruje przestrzeni wydzielonych zgłoszeń). Zamiast tego lepiej użyć metody opisanej w dogbanes answer.
Aby wyjaśnić swój błąd:
Jak powiedział for line in "find . -iname '*.txt'";
iteracje nad całą przestrzeń oddzielona wpisów, które są:
- znaleźć
- .
- -iname
- „* .txt” (chyba ...)
Pierwsze dwa nie powodują błędu (oprócz niepożądanego zachowania), ale trzeci jest problematyczne, ponieważ wykonuje :
ls -l -iname
wiele poleceń (bash) może łączyć opcje pojedynczego znaku, więc -iname
jest taka sama jak -i -n -a -m -e
. I voila: twój błąd invalid option -- 'e'
!
+1 To nie jest tylko lepsze, to prawda. – chepner
Mam problem z uruchomieniem tego, gdy skrypt zawierający ten fragment zostanie wywołany z cronjob @reboot. Składa skargę na flagę -d polecenia read, a następnie nie uruchamia się. W przeciwnym razie działa świetnie. –
Działa na bash, nie na sh. – Antzi