Yang -depth
utama find
menyebabkannya melakukan pencarian kedalaman-pertama.
Namun, urutan default bukan pencarian pertama.
Urutan default dapat digambarkan secara informal sebagai "traversal kedalaman-pertama yang menangani node ketika mereka pertama kali ditemui daripada melakukannya selama backtracking."
Saya memiliki kebutuhan aktual untuk pencarian pertama yang luas. Bagaimana saya bisa find
bersikap seperti ini?
Sebagai ilustrasi, dengan pengaturan berikut:
$ mkdir -p alpha/{bravo,charlie,delta}
$ touch alpha/charlie/{alpha,beta,gamma,phi}
find
memiliki perilaku default berikut:
$ find alpha
alpha
alpha/charlie
alpha/charlie/alpha
alpha/charlie/phi
alpha/charlie/beta
alpha/charlie/gamma
alpha/delta
alpha/bravo
dan dengan -depth
, ini berfungsi sebagai berikut:
$ find alpha -depth
alpha/charlie/alpha
alpha/charlie/phi
alpha/charlie/beta
alpha/charlie/gamma
alpha/charlie
alpha/delta
alpha/bravo
alpha
Namun, yang saya inginkan adalah opsi (fiktif) berikut:
$ find alpha -bfs
alpha
alpha/charlie
alpha/delta
alpha/bravo
alpha/charlie/alpha
alpha/charlie/phi
alpha/charlie/beta
alpha/charlie/gamma
Dengan kata lain saya perlu find
memproses / melaporkan semua file / dir pada kedalaman yang diberikan sebelum melanjutkan.
Bagaimana saya bisa melakukan ini?
find
(setidaknya, tidak hanya denganfind
). Apakah Anda hanya ingin membuat daftar file, atau Anda ingin menggunakan pemilihan pendahuluan lainnya?-bfs
tidak akan seperti yang saya butuhkan ... Saya punya skrip sederhana yang menghasilkan indeks ke proyek GitLab besar, cocok untuk dimasukkan dalam GitLab Wiki. Itu membuat header secara hierarkis berdasarkan nama direktori. Ini berfungsi dengan baik, kecuali bahwa dalam struktur file contoh di atas itu akan diletakkan didelta
bawahcharlie
subjudul, bukan di bawahalpha
tajuk induk .find
keluaran yang diurutkan berdasarkan abjad. Tidak tahu mengapa ....-bfs
bisa berguna, bahkan jika itu tidak cocok dengan kasus penggunaan ini.Jawaban:
Anda dapat melakukannya hanya dengan wildcard. Membangun pola dengan tingkat direktori yang semakin meningkat.
Ini melewatkan file dot. Gunakan
FIGNORE='.?(.)'
di ksh,shopt -s dotglob
di bash, atausetopt glob_dots
di zsh untuk memasukkannya.Peringatan:
Jika Anda ingin memilih urutan atau direktori dan non-direktori, dan kinerja tidak kritis, Anda dapat membuat dua lintasan dan menguji
[ -d "$file" ]
setiap lintasan.sumber
*
. :)nullglob
dan gunakan(($#))
sebagai kondisi loop untuk menghindari kasus tepi ini.# cat ./bfind
Ini bekerja dengan meningkatkan kedalaman
find
dan mengulangi, saya pikir ini mungkin mengulangi hasil, tetapi bisa disaring dengan mudahsumber
Anda bisa menyalurkannya
find
ke semacam yang terutama mengurutkan berdasarkan jumlah/
karakter di pathname. Sebagai contoh,Ini digunakan
awk
untuk awalan pathname dengan jumlah garis miring, dansed
untuk menghapus awalan ini di akhir.Sebenarnya, karena Anda mungkin ingin isi direktori
alpha/charlie+
terdaftar setelahnyaalpha/charlie
, Anda perlu mengatakansort -t/ -k1,1 -k2,2 -k3,3 -k4,4
hingga kedalaman yang diinginkan.sumber
Jawaban lain tidak berdasarkan 'find' tetapi pada bash - gunakan "length of parent directory" terlebih dahulu, lalu urutkan berdasarkan alpha.
Jawabannya tidak cocok dengan hasil Anda memiliki "charlie, bravo, delta" tetapi saya bertanya-tanya apakah itu harus "bravo, charlie, delta" dalam urutan alfa.
Itu menghasilkan
sumber