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)
Jawaban yang Diterima:
find . -type f -name "*.htm*" -o -name "*.js*" -o -name "*.txt"
adalah singkatan dari:
find . ( ( -type f -a -name "*.htm*" ) -o ( -name "*.js*" ) -o ( -name "*.txt" ) ) -a -print
Artinya, karena tidak ada tindakan predikat ditentukan (hanya kondisi ), sebuah -print
tindakan secara implisit ditambahkan untuk file yang cocok dengan kondisi.
(dan, omong-omong, itu akan mencetak .js
non non-reguler file (-type f
hanya berlaku untuk .htm
file)).
Sementara:
find . -type f -name "*.htm*" -o -name "*.js*" -o -name "*.txt" -exec sh -c 'echo "$0"' {} ;
adalah singkatan dari:
find . ( -type f -a -name "*.htm*" ) -o ( -name "*.js*" ) -o ( -name "*.txt" -a -exec sh -c 'echo "$0"' {} ; )
Untuk find
(seperti dalam banyak bahasa), DAN (-a
; implisit ketika dihilangkan) lebih diutamakan daripada ATAU (-o
), dan menambahkan predikat tindakan eksplisit (di sini -exec
) membatalkan -print
tindakan implisit terlihat di atas. Di sini, Anda ingin:
find . -type f ( -name "*.htm*" -o -name "*.js*" -o -name "*.txt" )
-exec sh -c 'echo "$0"' {} ;
Atau:
find . -type f ( -name "*.htm*" -o -name "*.js*" -o -name "*.txt" ) -exec sh -c '
for i do
echo "$i"
done' sh {} +
Untuk menghindari menjalankan satu sh
per file.