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 ls
en esta mansión generalmente está mal visto porque la salida de ls
es difícil de analizar. Es mejor usar el find
comando, 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 basename
para 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 find
comando pase cada directorio profundo de 2 niveles al basename
comando. La notación basename {}
es lo que está haciendo estas conversiones de nombre base. Encuentra llamadas a través de su -exec
interruptor.
-exec basename {}
hace, ¿podrían explicarlo aquí?find ~/ -maxdepth 1 -mindepth 1 -type d | xargs du -csh | sort -h
Encuentra 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
find
como GNU y algunas BSD:Eso encontrará todos los directorios (
-type d
) que están en un subdirectorio/usr/share/festival/voices/
debido a,mindepth 2
pero no son más profundos que 3 niveles hacia abajo (maxdepth 3
). Deman find
:fuente
-type f
a-type d
debería resolver esto, ¿verdad? También esperará la respuesta de slm con respecto al propósito de-exec basename {}
-type d
encontrará directorios. Elbasename
es 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 basename
y tambiénman dirname
.La respuesta aceptada funciona correctamente pero es algo ineficiente porque genera un nuevo
basename
proceso para cada subdirectorio:Cuando sea posible, es preferible usar funciones integradas
find
para evitar el gasto de los procesos de generación.find
tiene una capacidad bastante amplia para modificar su salida impresa usando la-printf
acción. La-print
acción predeterminada imprime la ruta completa, pero utilizando-printf
y 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 lobasename
hace), la cadena de formato es%f
. Para colocar una nueva línea después de cada nombre de archivo, incluya\n
lo siguiente:fuente
find
con 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
N
está cualquier número?fuente