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.