Saat saya menggunakan
find . -type f -name "*.htm*" -o -name "*.js*" -o -name "*.txt"
ia menemukan semua jenis file. Tetapi ketika saya menambahkan -exec
di akhir:
find . -type f -name "*.htm*" -o -name "*.js*" -o -name "*.txt" -exec sh -c 'echo "$0"' {} \;
sepertinya hanya mencetak .txt
file. Apa yang saya lakukan salah?
Catatan: menggunakan MINGW (Git Bash)
*.js*
atau*.txt
.Jawaban:
kependekan dari:
Yaitu, karena tidak ada predikat tindakan yang ditentukan (hanya kondisi ), suatu
-print
tindakan ditambahkan secara implisit untuk file yang cocok dengan kondisi tersebut.(dan, omong-omong, itu akan mencetak
.js
file tidak biasa (-type f
hanya berlaku untuk.htm
file)).Sementara:
kependekan dari:
Karena
find
(seperti dalam banyak bahasa), AND (-a
; implisit ketika dihilangkan) memiliki prioritas di atas OR (-o
), dan menambahkan predikat tindakan eksplisit (di sini-exec
) membatalkan-print
tindakan implisit yang terlihat di atas. Di sini, Anda ingin:Atau:
Untuk menghindari menjalankan satu
sh
per file.sumber
Itu adalah tanda kurung. Tambahkan tanda kurung eksplisit.
\(
\)
atau menggunakan xargs (Saya suka xargs saya merasa lebih mudah, tetapi tampaknya tidak portabel).
sumber