Estoy en Fedora, y estos paquetes de voz están en una ubicación ligeramente diferente:
$ 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
Simplemente puede modificar esto así:
$ ls /usr/share/festival/voices/*/ -1 | grep -vE "/usr|^$"
Usando find
El uso lsen esta mansión generalmente está mal visto porque la salida de lses difícil de analizar. Es mejor usar el findcomando, así:
$ 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
Detalles de find & basename
Este comando funciona produciendo una lista de rutas completas a los archivos que tienen exactamente 2 niveles de profundidad con respecto a este directorio:
/usr/share/festival/lib/voices
Esta lista se ve así:
$ 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
Pero queremos la última parte de estos directorios, el nodo hoja. Entonces podemos usar basenamepara analizarlo:
$ basename /usr/share/festival/lib/voices/us/nitech_us_awb_arctic_hts
nitech_us_awb_arctic_hts
Poniendo todo junto, podemos hacer que el findcomando pase cada directorio profundo de 2 niveles al basenamecomando. La notación basename {}es lo que está haciendo estas conversiones de nombre base. Encuentra llamadas a través de su -execinterruptor.
-exec basename {}hace, ¿podrían explicarlo aquí?find ~/ -maxdepth 1 -mindepth 1 -type d | xargs du -csh | sort -hEncuentra los directorios más grandes ordenados por tamañoLo más fácil es
El shell lo expande a todos los subdirectorios
/usr/share/festival/voices/y luego a los contenidos de cada uno de esos subdirectorios.Si solo desea descender a un nivel específico como sugiere su título, con algunas implementaciones
findcomo GNU y algunas BSD:Eso encontrará todos los directorios (
-type d) que están en un subdirectorio/usr/share/festival/voices/debido a,mindepth 2pero no son más profundos que 3 niveles hacia abajo (maxdepth 3). Deman find:fuente
-type fa-type ddebería resolver esto, ¿verdad? También esperará la respuesta de slm con respecto al propósito de-exec basename {}-type dencontrará directorios. Elbasenamees una muy buena idea, se imprimirá sólo el nombre y eliminar la ruta. Asumiendo que solo quieres nombres, eso es lo que debes hacer. Echa un vistazoman basenamey tambiénman dirname.La respuesta aceptada funciona correctamente pero es algo ineficiente porque genera un nuevo
basenameproceso para cada subdirectorio:Cuando sea posible, es preferible usar funciones integradas
findpara evitar el gasto de los procesos de generación.findtiene una capacidad bastante amplia para modificar su salida impresa usando la-printfacción. La-printacción predeterminada imprime la ruta completa, pero utilizando-printfy una cadena de formato es posible seleccionar partes de la ruta para imprimir. Para extraer solo la parte del nombre de archivo de la ruta sin los directorios iniciales (como lobasenamehace), la cadena de formato es%f. Para colocar una nueva línea después de cada nombre de archivo, incluya\nlo siguiente:fuente
findcon comandos externos arbitrarios; es menos eficiente para las operaciones integradasfind. Había considerado agregar un comentario a su respuesta, pero eso requiere más reputación que la que tengo. No es necesario cambiar su respuesta aceptada, ya que la respuesta aceptada actualmente es correcta, está bien explicada y puede utilizarse como un patrón para el caso más general; Solo quería señalar que para este caso específico hay un método más eficiente.TLDR; para aquellos que acaban de llegar basados en el título de esta pregunta; para "Listar subdirectorios solo n nivel profundo": use
¿Dónde
Nestá cualquier número?fuente