Saya ingin menemukan semua direktori dengan string tertentu sehingga saya dapat melakukan pencarian lain pada file yang ada di dalamnya.
Jadi saya tidak ingin membuang waktu, ./my-search-term/dir/my-search-term
dll.
Bagaimana saya bisa berhenti berulang ketika saya telah menemukan direktori istilah pencarian saya yang pertama?
Jawaban:
The
-prune
tindakan membuatfind
tidak recurse ke dalam direktori. Anda dapat menggabungkannya dengan tindakan lain seperti-exec
(urutan-prune
dan-exec
tidak masalah, asalkan-prune
dieksekusi bagaimanapun juga).Perhatikan bahwa bersarang
find
di dalam afind -exec
bisa sedikit bermasalah: Anda tidak dapat menggunakan-exec
di bagian dalamfind
, karena terminator akan dilihat sebagai terminator oleh bagian luarfind
. Anda dapat mengatasinya dengan menggunakan shell, tetapi jangan mengutip.sumber
-prune
mengembalikan true dan dapat diletakkan sebelum-exec
.-o
di sana, kurasa. Dan saya kira menempatkan-prune
sebelumnya-exec
lebih mudah dibaca.-prune
opsi sebelumnya.mkdir -p x1 x2; touch x1/x11 x1/x12 x2/x21 x2/x22; find . -name 'x1*' -exec rm -rf {} \;
memberikan kesalahan:find: ./x1: No such file or directory
. Solusinya adalah menambahkan-prune
di akhirfind
perintah.find
memperluas{}
bahkan ketika muncul sebagai substring dari suatu argumen-exec
. Versi seperti itufind
akan mencekik perintah kedua Anda, karena perintah{}
di dalamfind
(di perintah shell) akan diganti dengan nama direktori yang ditemukan di bagian luarfind
. Anda dapat memperbaikinya dengan mengatakanfind . -name my-search-term -prune -exec sh -c 'find "$0" … -exec … "{"} +' {} \;
mis. Menggunakan"{"}
, di mana shell akan berubah menjadi{}
. ... (Lanjutan)- solusi terbuka -
Jika Anda ingin
find
melewatkan konten direktori yang ditemukan, tetapi terus mencari di direktori lain, gunakan-prune
seperti yang disarankan @laebshade. Perintah lengkapnya akan terlihat sepertiDi sisi lain, jika Anda ingin
find
untuk sepenuhnya berhenti mencari dan setelah menemukan direktori yang cocok pertama, maka apa yang Anda cari adalah-quit
(tersedia sejak versi4.2.3
dariGNU find
). Yang ini sedikit lebih rumit untuk digunakan, karena iafind
langsung keluar - jadi-quit
harus ditempatkan di bagian paling akhir dari perintah:Agar ini berfungsi seperti yang diharapkan, kita harus memastikan bahwa
-exec
pengembalian benar (dengan kata lain, status nol ). Jika Anda ingin status keluar-exec
diabaikan, sehingga-quit
selalu berfungsi, Anda perlu sedikit trik:atau
atau
- beberapa penjelasan -
Hal terpenting tentang cara
find
kerjanya adalah bahwa semua tindakan ("tes") diperlakukan sebagai predikat logis yang ditafsirkan dari kiri ke kanan. Oleh karena itu, tindakan terakhir (misalnya-quit
) hanya akan dilakukan jika seluruh bagian sebelumnya tidak mengembalikan false . Secara default, semua tes digabungkan dengan "DAN" yang logis,-o
opsi mengubah sambungan menjadi "ATAU".Elemen yang rumit
-o
adalah yangfind
dapat "mengoptimalkan" perintah Anda dan tidak menjalankan-exec
bagian jika Anda mengetikkan sajaUntuk mengatasinya, Anda dapat memaksa
find
untuk mengevaluasi semua predikat yang digabung dengan "ATAU", dengan melampirkannya di dalam tanda kurung.sumber