Saya perlu mengecualikan .git
dari find
pencarian saya . Untuk mencapai itu, saya menggunakan -path ./.git -prune
sakelar:
$ find . -path ./.git -prune -o \( -type f -o -type l -o -type d \) | grep '.git'
./.git
Namun, meskipun ini melompati isi direktori .git, ia mencantumkan direktori itu sendiri. Ini berfungsi saat saya menambahkan-path ./.git -prune -o -print -a
find . -path ./.git -prune -o -print -a \( -type f -o -type l -o -type d \) | grep '.git'
Mengapa ini perlu? Saya pikir kedua perintah harus memiliki output yang sama. Sintaks kedua cukup jelek.
-print
, jika tidak, implisit-print
berlaku untuk seluruh kondisiJawaban:
The
man
halaman untukfind
memberikan:Jadi dalam contoh pertama tidak begitu tidak
-path ./.git -prune
benar dan oleh karena itu tindakan default (-print
) tidak akan dipanggil, maka garis tersebut dicetak.sumber
Saya bingung mengapa direktori pemangkasan dicetak oleh
find
perintah juga, dan beberapa detail rumit lainnya tentang cara-prune
kerjanya, tetapi saya bisa mengetahuinya dengan beberapa contoh.Untuk menjalankan contoh di bawah ini, buat direktori dan file berikut.
Untuk membuat struktur ini:
Sekarang gunakan find untuk mencari direktori bernama
aa
. Tidak masalah di sini.Cari semua direktori selain aa dan kami mendapatkan direktori saat ini
.
dan./bb
, yang juga masuk akal.Sejauh ini bagus, tetapi ketika kita menggunakan
-prune
, temukan mengembalikan direktori yang kita pangkas, yang awalnya membingungkan saya karena saya mengharapkannya untuk mengembalikan semua direktori lain dan bukan yang sedang dipangkas.Alasan mengapa ia mengembalikan direktori yang sedang dipangkas dijelaskan, bukan di
-prune
bagian halaman manual seperti yang ditunjukkan dalam jawaban Timo , tetapi diEXPRESSIONS
bagian:yang berarti bahwa, karena ekspresi cocok dengan
aa
nama direktori, maka ekspresi akan bernilai true dan akan dicetak karena find secara implisit menambahkan a-print
di akhir seluruh perintah. Namun, itu tidak akan menambahkan-print
, jika Anda sendiri sengaja menambahkan tindakan-o -print
ke akhir:Di sini perintah find TIDAK menambahkan implisit
-print
lagi, sehingga direktori yang kita pangkas (aa
) tidak akan dicetak.Jadi akhirnya, jika kita menambahkan klausa yang mencari file dengan pola nama
file*
setelah-o
, maka Anda harus meletakkan-print
di akhir klausa kedua seperti ini:Alasan mengapa ini bekerja adalah sama: Jika Anda tidak memasukkan a
-print
dalam klausa kedua, maka karena tidak ada tindakan selain-prune
tindakan, find akan menambahkan secara-print
otomatis di THE END perintah, menyebabkan-prune
klausa untuk mencetak direktori pangkas:Secara umum, Anda perlu menempatkan
-print
perintah di klausa kedua. Jika Anda meletakkannya di tengah seperti yang dilakukan oleh poster asli, itu tidak akan berfungsi dengan benar karena file yang dipangkas akan segera dicetak dan klausa kedua tidak akan mendapatkan kesempatan untuk memilih file yang diinginkan:Jadi sayangnya, poster asli mendapat perintah yang salah di atas dengan menempatkannya
-print
di tempat yang salah. Mungkin berhasil untuk kasus spesifiknya, tetapi tidak bekerja dalam kasus umum.Ada ribuan orang yang kesulitan memahami cara
-prune
kerjanya. Thefind
halaman manual harus diperbarui untuk mencegah kebingungan di seluruh dunia neverending tentang perintah ini.sumber
find-4.6.0
) mengatakan, "Jika seluruh ekspresi tidak mengandung tindakan selain -prune atau -print, -print dilakukan pada semua file yang seluruh ekspresi benar." Tetapi berfungsi seperti yang Anda gambarkan.dari
man
halaman,Jadi, mungkin Anda bisa menggunakan:
Ini tidak akan mencantumkan
.git
direktori.untuk spesifik nama file, Anda dapat melakukan ini:
Harap perhatikan
,
operator koma.sumber
Inilah alternatif cepat dan kotor:
Saya tidak dapat mengingat
find
sintaks yang rumit ...sumber