Saya menggunakan Fedora, dan paket suara ini berada di lokasi yang sedikit berbeda:
$ ls /usr/share/festival/lib/voices/*/ -1 | grep -vE "/usr|^$"
kal_diphone
ked_diphone
nitech_us_awb_arctic_hts
nitech_us_bdl_arctic_hts
nitech_us_clb_arctic_hts
nitech_us_jmk_arctic_hts
nitech_us_rms_arctic_hts
nitech_us_slt_arctic_hts
Anda bisa memodifikasi seperti ini:
$ ls /usr/share/festival/voices/*/ -1 | grep -vE "/usr|^$"
Menggunakan find
Penggunaan ls
di rumah ini biasanya disukai karena hasil dari ls
sulit untuk diurai. Lebih baik menggunakan find
perintah, seperti:
$ find /usr/share/festival/lib/voices -maxdepth 2 -mindepth 2 \
-type d -exec basename {} \;
nitech_us_awb_arctic_hts
nitech_us_bdl_arctic_hts
nitech_us_slt_arctic_hts
nitech_us_jmk_arctic_hts
nitech_us_clb_arctic_hts
nitech_us_rms_arctic_hts
ked_diphone
kal_diphone
Detail menemukan & nama kecil
Perintah ini bekerja dengan menghasilkan daftar path lengkap ke file yang tepat 2 level sehubungan dengan direktori ini:
/usr/share/festival/lib/voices
Daftar ini terlihat seperti ini:
$ find /usr/share/festival/lib/voices -maxdepth 2 -mindepth 2
/usr/share/festival/lib/voices/us/nitech_us_awb_arctic_hts
/usr/share/festival/lib/voices/us/nitech_us_bdl_arctic_hts
/usr/share/festival/lib/voices/us/nitech_us_slt_arctic_hts
/usr/share/festival/lib/voices/us/nitech_us_jmk_arctic_hts
/usr/share/festival/lib/voices/us/nitech_us_clb_arctic_hts
/usr/share/festival/lib/voices/us/nitech_us_rms_arctic_hts
/usr/share/festival/lib/voices/english/ked_diphone
/usr/share/festival/lib/voices/english/kal_diphon
Tapi kami ingin bagian terakhir dari direktori ini, simpul daun. Jadi kita dapat menggunakan basename
untuk menguraikannya:
$ basename /usr/share/festival/lib/voices/us/nitech_us_awb_arctic_hts
nitech_us_awb_arctic_hts
Menyatukan semuanya, kita bisa membuat find
perintah melewati setiap direktori 2 level ke basename
perintah. Notasi basename {}
adalah apa yang melakukan konversi nama dasar ini. Temukan panggilan melalui -exec
sakelar itu.
-exec basename {}
terjadi, dapatkah Anda jelaskan di sini?find ~/ -maxdepth 1 -mindepth 1 -type d | xargs du -csh | sort -h
Temukan direktori terbesar yang diurutkan berdasarkan ukuranYang paling mudah adalah
Itu diperluas oleh shell ke semua sub direktori
/usr/share/festival/voices/
dan kemudian ke isi dari masing-masing sub direktori.Jika Anda hanya ingin turun ke level tertentu seperti judul Anda, dengan beberapa implementasi
find
seperti GNU dan beberapa BSD:Itu akan menemukan semua direktori (
-type d
) yang ada di subdirektori/usr/share/festival/voices/
karenamindepth 2
tetapi tidak lebih dalam dari 3 level ke bawah (maxdepth 3
). Dariman find
:sumber
-type f
ke-type d
harus mengatasi ini, kan? Akan juga menunggu tanggapan slm mengenai tujuan-exec basename {}
-type d
akan menemukan direktori. Inibasename
adalah ide yang sangat bagus, itu hanya akan mencetak nama dan menghapus path. Dengan asumsi Anda hanya menginginkan nama, itulah yang harus Anda lakukan. Lihatman basename
dan jugaman dirname
.The jawaban diterima bekerja dengan benar tapi agak tidak efisien karena memunculkan baru
basename
proses untuk setiap subdirektori:Jika memungkinkan, lebih baik menggunakan fitur yang dibangun
find
untuk menghindari biaya proses pemijahan.find
memiliki kemampuan yang cukup luas untuk memodifikasi hasil cetaknya menggunakan-printf
action. Tindakan default-print
mencetak seluruh jalur, tetapi menggunakan-printf
dan format string mungkin untuk memilih bagian dari jalur untuk dicetak. Untuk mengekstrak hanya bagian nama file dari path tanpa direktori utama (sepertibasename
halnya), format string adalah%f
. Untuk menempatkan baris baru setelah setiap nama file, sertakan\n
sebagai berikut:sumber
find
dengan perintah eksternal yang arbitrer; itu hanya kurang efisien untuk operasi yang dibangunfind
. Saya telah mempertimbangkan untuk menambahkan komentar pada jawabannya, tetapi itu membutuhkan lebih banyak reputasi daripada yang saya miliki. Tidak perlu mengubah jawaban yang Anda terima, karena jawaban yang diterima saat ini benar, dijelaskan dengan baik, dan dapat digunakan sebagai pola untuk kasus yang lebih umum; Saya hanya ingin menunjukkan bahwa untuk kasus khusus ini ada metode yang lebih efisien.TLDR; untuk mereka yang datang ke sini berdasarkan judul pertanyaan ini; untuk "Daftar subdirektori hanya dalam n level": gunakan
di mana
N
ada nomorsumber