for
-loop akan mengulangi setiap entri (dipisahkan spasi) pada string yang disediakan.
Anda sebenarnya tidak menjalankan find
perintah, tetapi berikan sebagai string (yang diulangi oleh for
-loop). Alih-alih tanda kutip ganda, gunakan backticks atau $()
:
for line in $(find . -iname '*.txt'); do
echo "$line"
ls -l "$line"
done
Selain itu, jika jalur/nama file Anda berisi spasi, metode ini gagal (karena for
-loop mengulangi entri yang dipisahkan ruang). Alih-alih, lebih baik menggunakan metode yang dijelaskan dalam jawaban dogbanes.
Untuk mengklarifikasi kesalahan Anda:
Seperti yang dikatakan, for line in "find . -iname '*.txt'";
mengulangi semua entri yang dipisahkan ruang, yaitu:
- temukan
- .
- -iname
- '*.txt' (menurut saya...)
Dua yang pertama tidak menghasilkan kesalahan (selain perilaku yang tidak diinginkan), tetapi yang ketiga bermasalah saat dijalankan:
ls -l -iname
Banyak perintah (bash) yang dapat menggabungkan opsi karakter tunggal, jadi -iname
sama dengan -i -n -a -m -e
. Dan voila:invalid option -- 'e'
Anda kesalahan!
Berikut adalah cara yang lebih baik untuk mengulang file karena menangani spasi dan baris baru dalam nama file:
#!/bin/bash
find . -type f -iname "*.txt" -print0 | while IFS= read -r -d $'\0' line; do
echo "$line"
ls -l "$line"
done
Gunakan substitusi perintah alih-alih tanda kutip untuk menjalankan find alih-alih meneruskan perintah sebagai string:
for line in $(find . -iname '*.txt'); do
echo $line
ls -l $line;
done
Versi yang lebih ringkas bekerja dengan spasi dan baris baru dalam nama file:
find . -iname '*.txt' -exec sh -c 'echo "{}" ; ls -l "{}"' \;