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.
mkdir aa
mkdir bb
touch file1
touch aa/file1
touch bb/file3
Untuk membuat struktur ini:
$ tree
.
├── aa
│ └── file1
├── bb
│ └── file3
└── file1
Sekarang gunakan find untuk mencari direktori bernama aa
. Tidak masalah di sini.
$ find . -type d -name aa
./aa
Cari semua direktori selain aa dan kami mendapatkan direktori saat ini .
dan ./bb
, yang juga masuk akal.
$ find . -type d ! -name aa
.
./bb
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.
$ find . -type d -name aa -prune
./aa
Alasan mengapa ia mengembalikan direktori yang sedang dipangkas dijelaskan, bukan di -prune
bagian halaman manual seperti yang ditunjukkan dalam jawaban Timo , tetapi di EXPRESSIONS
bagian:
Jika ekspresi tidak mengandung tindakan selain -prune
,
-print
dilakukan pada semua file yang ekspresinya benar.
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:
find . -type d -name aa -prune -o -print
.
./file1
./bb
./bb/file3
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:
find . \( -type d -name aa -prune \) -o \( -type f -name 'file*' -print \)
./file1
./bb/file3
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:
find . \( \( -type d -name aa -prune \) -o \( -type f -name 'file*' \) \) -print
./aa
./file1
./bb/file3
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:
find . \( -type d -name aa -prune -o -print \) -o \( -type f -name 'file*' \)
.
./file1
./bb
./bb/file3
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. The find
halaman manual harus diperbarui untuk mencegah kebingungan di seluruh dunia neverending tentang perintah ini.
-print
, jika tidak, implisit-print
berlaku untuk seluruh kondisi