web-dev-qa-db-fra.com

Obtenez une liste de noms de répertoire avec find

Je sais que je peux le faire pour obtenir une liste de noms de répertoire:

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 que find ne produise que les noms bruts?

J'ai essayé d'envoyer la liste à stat pour la formater mais cela me donne juste le même résultat:

find . -type d -maxdepth 1 -print0 | xargs -0 stat -f '%N'
40
joachim

Avec GNU find vous pouvez utiliser le -printf option:

find . -maxdepth 1 -type d -printf '%f\n'

Comme indiqué par Paweł dans les commentaires, si vous ne voulez pas que le répertoire actuel soit répertorié, ajoutez -mindepth 1, par exemple.:

find . -mindepth 1 -maxdepth 1 -type d -printf '%f\n'
44
Thor

Mise à jour:

Une alternative plus courte:

 find . -maxdepth 1 -type d | cut -c 3-

Vous donnera les noms, un par ligne, sans aucune barre oblique

18
Levon

En utilisant GNU find, vous pouvez utiliser -mindepth pour empêcher find de correspondre au répertoire courant:

find . -type d -maxdepth 1 -mindepth 1

Comme vous ne le faites pas récursivement, vous pouvez utiliser un glob bash:

echo */

L'ajout d'un signe de fin/à un glob entraînera uniquement la correspondance des répertoires.

9
jordanm

Je préfère utiliser:

 find ./ -type d -maxdepth 1 -exec basename {} \;
6
user1293137

Laissez sed supprimer ces deux caractères:

find . -maxdepth 1 -type d | sed -e 's/^\.\///'
6
Birei

J'utilise habituellement:

find * -type d

Mais je ne sais pas si c'est la bonne façon de faire ce que tu veux.

2
Francesco Turco

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

0
user1656294

Ce que vous recherchez s'appelle basename, il ignore la structure du répertoire unix

Exemple ci-dessous:

find /any/path/you/want -maxdepth 1 -type d -exec basename {} \;

il exclura pour la sortie même le chemin dir, supprimant la nécessité de cd avant d'exécuter la commande


Quelques informations supplémentaires:

Je passerais -exec comme argument pour trouver à la place | (pipe) une autre commande pour la sortie (en évitant que la deuxième commande passe sur chaque ligne de sortie, cela dit que, selon la sortie, cela pourrait améliorer les performances du script)

REMARQUE: find les options sont pas positionnelles (-maxdepth affecte les tests spécifiés avant lui ainsi que ceux spécifiés après).

0
gonzalesraul