Je sais que je peux le faire pour obtenir une liste de noms de répertoires:
find . -type d -maxdepth 1
La sortie ressemble à ceci:
.
./foo
./bar
Je préfère la liste sans ./
. Existe-t-il un moyen d'obtenir find pour sortir uniquement les noms bruts?
J'ai essayé d'envoyer la liste à stat pour la formater mais cela me donne le même résultat:
find . -type d -maxdepth 1 -print0 | xargs -0 stat -f '%N'
foo bar ...
tout sur une seule ligne sans le./
devant?Réponses:
Avec GNU,
find
vous pouvez utiliser l’-printf
option:Comme l'a noté Paweł dans les commentaires, si vous ne voulez pas que le répertoire courant soit répertorié, ajoutez-le
-mindepth 1
, par exemple:la source
-printf
option dans la dernière spécification POSIX et je me demande à quel point elle est portable ...printf
options proposées n’est mentionnée par POSIX et elles ne semblent pas être supportées par certaines des autresfind
versions. GNU find peut être installé dans la plupart des endroits, il est donc portable.-mindepth 1
si vous voulez vous débarrasser de la.
Mise à jour:
Une alternative plus courte:
Vous donnera les noms, un par ligne, sans barres obliques
la source
ls
. En même temps, j'avais posté un lien expliquant pourquoi il s'agissait d'une mauvaise idée pour une autre réponse supprimée depuis. À l'époque, il n'y avait que 2 réponses et la raison semblait évidente. Je suis content que vous ayez souligné l'ambiguïté, et voici mon explication. Pour mémoire, j’ai tourné mon vote vers le bas en vote positif, car je suis d’accord avec votre réponse actuelle.\n
nom de répertoire que vous ne pouvez pas utiliser, cut, pour le récupérer (ce que vous faisiez lorsque je vous ai voté contre). Il y a peu de cas où ills
ne se comporte pas de manière dangereuse et il est presque toujours plus prudent d'utiliser une autre méthode.Avec GNU find, vous pouvez utiliser -mindepth pour empêcher find de correspondre au répertoire actuel:
Comme vous ne le faites pas de manière récursive, vous pouvez utiliser un bash glob:
L'ajout d'une fin / à un glob ne fera correspondre que les répertoires.
la source
*/
manque les fichiers de points et inclut les liens symboliques. Cela peut ou peut ne pas être un problème.Laissez
sed
supprimer ces deux personnages:la source
Je préfère utiliser:
la source
J'utilise habituellement:
Mais je ne sais pas si c'est la bonne façon de faire ce que vous voulez.
la source
echo */
ferait la même chose, plus ou moins (il manque des fichiers de points et inclut des liens symboliques), mais alors joachim demanderait comment supprimer la finale/
.Sous AIX, le paramètre "maxdepth" ne fonctionne pas.
En général, cela fonctionne pour moi:
find ./ -type d | cut -d"/" -f2 | sort -u
la source
Ce que vous recherchez s'appelle
basename
, il ignore la structure de répertoires unixExemple ci-dessous:
find /any/path/you/want -maxdepth 1 -type d -exec basename {} \;
il exclura pour la sortie même le chemin du répertoire, supprimant la nécessité d’
cd
exécuter la commande avantQuelques informations supplémentaires:
Je passerais
-exec
en argument pour trouver à la place|
(pipe) une autre commande pour la sortie (en évitant que la deuxième commande ne passe par chaque ligne de sortie, cela dit, cela dépendrait de la sortie pour améliorer les performances du script)REMARQUE: les
find
options ne sont pas positionnelles (-maxdepth affecte les tests spécifiés avant lui ainsi que ceux spécifiés après).la source