Je suis sur Fedora, et ces VoicePacks sont dans un endroit légèrement différent:
$ 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
Vous pouvez simplement modifier ceci comme ceci:
$ ls /usr/share/festival/voices/*/ -1 | grep -vE "/usr|^$"
Utiliser find
L'utilisation ls
dans ce manoir est généralement mal vue parce que la sortie de ls
est difficile à analyser. Mieux vaut utiliser la find
commande, comme ceci:
$ 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
Détails de find & basename
Cette commande produit une liste de chemins complets vers des fichiers ayant exactement deux niveaux de profondeur par rapport à ce répertoire:
/usr/share/festival/lib/voices
Cette liste ressemble à ceci:
$ 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
Mais nous voulons la dernière partie de ces répertoires, le nœud feuille. Nous pouvons donc utiliser basename
pour l’analyser:
$ basename /usr/share/festival/lib/voices/us/nitech_us_awb_arctic_hts
nitech_us_awb_arctic_hts
En réunissant tout cela, nous pouvons faire en sorte que la find
commande transmette chaque répertoire de niveau 2 à la basename
commande. La notation basename {}
est ce qui fait ces conversions de nom de base. Trouver des appels via son -exec
commutateur.
-exec basename {}
passe, pourriez-vous expliquer ici?find ~/ -maxdepth 1 -mindepth 1 -type d | xargs du -csh | sort -h
les plus gros répertoires triés par tailleLe plus simple est
Cela est étendu par le shell à tous les sous-répertoires de
/usr/share/festival/voices/
, puis au contenu de chacun de ces sous-répertoires.Si vous souhaitez uniquement descendre à un niveau spécifique, comme le suggère votre titre, avec des implémentations
find
telles que GNU et BSD:Cela trouvera tous les répertoires (
-type d
) qui se trouvent dans un sous-répertoire à/usr/share/festival/voices/
cause demindepth 2
mais pas plus profonds que 3 niveaux inférieurs (maxdepth 3
). Deman find
:la source
-type f
en-type d
devrait résoudre cela, non? Attendra également la réponse de slm concernant le but de-exec basename {}
-type d
trouverez des répertoires. C'estbasename
une très bonne idée, cela n'imprimera que le nom et supprimera le chemin. En supposant que vous ne vouliez que des noms, c'est ce que vous devriez faire. Regardezman basename
et aussiman dirname
.La réponse acceptée fonctionne correctement mais est quelque peu inefficace car elle génère un nouveau
basename
processus pour chaque sous-répertoire:Dans la mesure du possible, il est préférable d’utiliser les fonctionnalités intégrées
find
afin d’éviter les coûts liés aux processus de génération.find
possède une capacité assez étendue pour modifier sa sortie imprimée à l'aide de l'-printf
action. L'-print
action par défaut imprime l'intégralité du chemin, mais en utilisant-printf
une chaîne de format, il est possible de sélectionner des parties du chemin à imprimer. Pour extraire uniquement la partie du nom de fichier du chemin d'accès sans les répertoires de début (comme c'est lebasename
cas), la chaîne de formatage est%f
. Pour placer une nouvelle ligne après chaque nom de fichier, incluez ce\n
qui suit:la source
find
avec des commandes externes arbitraires; c'est tout simplement moins efficace pour les opérations intégréesfind
. J'avais envisagé d'ajouter un commentaire à sa réponse, mais cela nécessite plus de réputation que moi. Il n'est pas nécessaire de changer votre réponse acceptée, car la réponse actuellement acceptée est correcte, bien expliquée et utilisable comme modèle pour le cas plus général. Je voulais seulement souligner que, dans ce cas particulier, il existe une méthode plus efficace.TLDR; pour ceux qui viennent juste ici sur la base du titre de cette question; sur "Répertorier uniquement les sous-répertoires de niveau n profond": utilisez
où
N
est n'importe quel nombre.la source