Estou no Fedora e esses pacotes de voz estão em um local um pouco 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
Você pode modificar isso assim:
$ ls /usr/share/festival/voices/*/ -1 | grep -vE "/usr|^$"
Usando find
O uso ls
dessa mansão geralmente é desaprovado, porque ls
é difícil analisar a saída de . Melhor usar o find
comando, assim:
$ 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
Detalhes da localização e nome da base
Este comando funciona produzindo uma lista de caminhos completos para arquivos com exatamente 2 níveis de profundidade em relação a este diretório:
/usr/share/festival/lib/voices
Essa lista é assim:
$ 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
Mas queremos a última parte desses diretórios, o nó da folha. Para que possamos basename
analisá-lo:
$ basename /usr/share/festival/lib/voices/us/nitech_us_awb_arctic_hts
nitech_us_awb_arctic_hts
Juntando tudo, podemos fazer com que o find
comando passe cada diretório profundo de 2 níveis para o basename
comando. A notação basename {}
é o que está fazendo essas conversões de nome de base. Encontre chama através do -exec
switch.
-exec basename {}
faz, você poderia explicar aqui?find ~/ -maxdepth 1 -mindepth 1 -type d | xargs du -csh | sort -h
Encontra os maiores diretórios ordenados em tamanhoO mais fácil é
Isso é expandido pelo shell para todos os subdiretórios
/usr/share/festival/voices/
e depois para o conteúdo de cada um desses subdiretórios.Se você deseja apenas descer para um nível específico, como o título sugere, com algumas implementações
find
como GNU e BSD:Isso encontrará todos os diretórios (
-type d
) que estão em um subdiretório por/usr/share/festival/voices/
causa,mindepth 2
mas não estão mais profundos que 3 níveis abaixo (maxdepth 3
). Deman find
:fonte
-type f
para-type d
resolver isso, certo? Também esperará a resposta do slm com relação ao objetivo de-exec basename {}
-type d
encontrará diretórios. Abasename
é uma idéia muito boa, ele irá imprimir apenas o nome e remover o caminho. Supondo que você queira apenas nomes, é isso que você deve fazer. Dê uma olhadaman basename
e tambémman dirname
.A resposta aceita funciona corretamente, mas é um pouco ineficiente porque gera um novo
basename
processo para cada subdiretório:Quando possível, é preferível usar os recursos incorporados
find
para evitar a despesa dos processos de desova.find
possui uma capacidade bastante extensa para modificar sua saída impressa usando a-printf
ação A-print
ação padrão imprime o caminho inteiro, mas usando-printf
uma string de formato é possível selecionar partes do caminho para impressão. Para extrair apenas a parte do nome do arquivo do caminho sem os diretórios principais (comobasename
faz), a cadeia de caracteres de formato é%f
. Para colocar uma nova linha após cada nome de arquivo, inclua\n
o seguinte:fonte
find
com comandos externos arbitrários; é apenas menos eficiente para operações integradasfind
. Eu tinha pensado em adicionar um comentário à sua resposta, mas isso requer mais reputação do que eu. Não há necessidade de alterar sua resposta aceita, pois a resposta atualmente aceita está correta, bem explicada e utilizável como padrão para o caso mais geral; Eu só queria salientar que, para este caso específico, existe um método mais eficiente.TLDR; para aqueles que estão chegando aqui com base no título desta pergunta; para "Listar subdiretórios apenas com nível n profundo": use
Onde
N
está qualquer número.fonte