GNU/Linux >> Belajar Linux >  >> Linux

`find` Dengan Banyak `-name` Dan `-exec` Hanya Mengeksekusi Yang Terakhir dari `-name`?

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.


Linux
  1. CloudCross – Menyinkronkan File dan Direktori dengan Beberapa Penyimpanan Cloud

  2. Mendapatkan info dengan perintah vsish (hanya esxi)

  3. beberapa antarmuka fisik dengan IP pada subnet yang sama

  1. Putar dan arsipkan log dengan perintah Linux logrotate

  2. Tonton perintah dan tugas dengan perintah jam tangan Linux

  3. Grep dalam file log besar (>14 GB) hanya x GB terakhir?

  1. Temukan file dan direktori di Linux dengan perintah find

  2. Bagaimana Menjalankan Grep Dengan Banyak Dan Pola?

  3. Bagaimana Cara Memindahkan File Dan Melihat Kemajuannya (mis. Dengan Bilah Kemajuan)?