pilihan pertama di utilitas `find 'Linux?


12

Apakah ada opsi breadth-first / depth-first di utilitas `find 'Linux?

Jawaban:


5

Tidak ada yang built-in untuk ditemukan, bahkan GNU menemukan. Anda dapat memposting proses finduntuk mengurutkan berdasarkan jumlah garis miring, misalnya dengan Perl:

find ... | perl -e 'print sort {$a=~s!/!/! <=> $b=~s!/!/!} <>'
  • <> adalah daftar semua jalur input;
  • $a =~ s!/!/!gadalah jumlah garis miring $a, yang kami gunakan sebagai kriteria sortir.

Jika Anda dapat menggunakan zsh:

echo **/*(oe\''REPLY=${REPLY//[^\/]}'\')
  • **/* daftar semua file dalam direktori dan subdirektori saat ini.
  • Barang-barang di dalam kurung adalah kualifikasi bola.
  • Kualifikasi glob oemengontrol urutan pengembalian pertandingan: mereka diurutkan berdasarkan nilai REPLYsetelah menjalankan kode di sini dalam tanda kutip untuk setiap pertandingan dengan REPLYawalnya diatur ke jalur yang cocok.
  • Kode tersebut bertransformasi $REPLYuntuk menghapus semuanya kecuali garis miring. Jadi hasilnya terdiri dari semua pada kedalaman 1 (hasil kosong $REPLY), lalu semuanya pada kedalaman 2 ( $REPLYberakhir menjadi /), kedalaman 3 ( //), dll.

1
Proses sortir posting sangat menarik, namun, sort membutuhkan pencarian yang harus diselesaikan, dan Anda tidak akan memiliki kesempatan untuk mengontrol jeda.
Xiè Jìléi


1

Perasaan saya adalah bahwa Anda bisa. Ini melibatkan grep dan ini dan sebuah loop, tetapi saya menemukan itu bekerja dengan sangat baik, khusus untuk kasus Anda tentang menemukan tidak perlu diselesaikan.

Ini lebih intensif sumber daya karena:

  • Banyak forking
  • Banyak penemuan
  • Setiap direktori sebelum kedalaman saat ini dihantam oleh menemukan sebanyak yang ada total kedalaman ke struktur file (ini seharusnya tidak menjadi masalah jika Anda memiliki praktis jumlah ram ...)

Ini bagus karena:

  • Ini menggunakan alat bash dan dasar gnu
  • Ini dapat rusak kapan saja Anda inginkan (seperti Anda melihat apa yang Anda cari terbang dengan)
  • Ini bekerja per baris dan bukan per menemukan, sehingga perintah selanjutnya tidak harus menunggu untuk menemukan dan semacamnya
  • Ini bekerja berdasarkan pemisahan sistem file yang sebenarnya, jadi jika Anda memiliki direktori dengan slash di dalamnya, itu tidak akan terdaftar lebih dalam dari itu; jika Anda memiliki pemisah lintasan yang berbeda yang dikonfigurasi, Anda masih baik-baik saja.
#! / bin / bash 
kedalaman = 0

sambil menemukan -mindepth $ depth -maxdepth $ depth | grep '.'
melakukan
    depth = $ ((depth + 1))
selesai

Anda juga dapat memasangnya dalam satu baris dengan cukup (?) Dengan mudah:

depth=0; while find -mindepth $depth -maxdepth $depth | grep --color=never '.'; do depth=$((depth + 1)); done

Tapi saya lebih suka skrip kecil daripada mengetik ...

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.