Liste des répertoires uniquement sous UNIX

219

Je veux lister uniquement les répertoires dans le chemin spécifié ( lsn'a pas une telle option). En outre, cela peut-il être fait avec une seule commande de ligne?

S'am
la source
12
Pour l'avenir: Peut-être que les questions de type Unix / Linux basics pas si difficiles liées à la programmation sont mieux conservées: unix.stackexchange.com
echox

Réponses:

315

Essayez ceci ls -d */pour lister les répertoires dans le répertoire courant

David Hancock
la source
17
Hé, c'est assez chouette, je me suis toujours habitué à nous ls -al | grep '^d'- c'est beaucoup plus succinct.
paxdiablo
43
pourquoi utiliser * / ?? S'il vous plaît, expliquez!?
Chandeep
6
Je n'ai pas d'explication appropriée, mais je sais que cela */force l'affichage uniquement des éléments se terminant par une barre oblique, qui dans ce cas serait un répertoire, même si l' -Foption de lsn'est pas utilisée. Similaire au comportement ls *phpet à la façon dont il affiche tous les fichiers se terminant par phpdans un répertoire.
David Hancock
3
@ user975234 Quelqu'un a posé une question similaire, et il y a une très bonne explication du lien
user1766760
17
Fera juste echo */la même chose aussi
nos
95

Essaye ça:

find . -maxdepth 1 -type d
Robin
la source
8
Pour moi, cela semble être la façon dont cela devrait être fait. Contrairement aux lssolutions suggérées , il findest seul responsable de faire le travail (ne pas compter sur l'expansion des caractères génériques du shell, qui peut imposer des limites). C'est aussi beaucoup plus concis.
peterp
1
La mauvaise chose à ce sujet est que cela ne fonctionne pas si vous essayez de parcourir les résultats et que vos résultats ont des espaces dans les noms.
ubiquibacon
2
Sinon, si vous ne voulez pas inclure le répertoire lui - même: find * -maxdepth 0 -type d.
James Ko
@ubiquibacon Soit utiliser findl' option -print0ou -exec.
1
C'est vraiment lent, du moins sur mon Mac. Il semble faire la recherche récursive complète qui findne fait généralement que produire les dossiers en profondeur 1.
Kara Brightwell
22

Le suivant

find * -maxdepth 0 -type d

filtre essentiellement l'expansion de '*', c'est-à-dire toutes les entrées du répertoire courant, par la -type dcondition.

L'avantage est que la sortie est identique à ls -1 *, mais seulement avec les répertoires et les entrées ne commencent pas par un point

radiospiel
la source
13

Vous pouvez utiliser ls -d */outree -d

Une autre solution serait la globalisation mais cela dépend du shell que vous utilisez et si la globalisation des répertoires est prise en charge.

Par exemple ZSH:

zsh # ls *(/)
écho
la source
3
Avec quelle saveur d'Unix obtenez-vous tree?
Johnsyweb
toutes les grandes distries linux par exemple? désolé, je ne comprends pas la question?
echox
1
J'ai une distribution Debian et treen'est pas installée par défaut (bien qu'elle soit dans les référentiels).
Stephen Schrauger
1
Downvotes car je crois que la treecommande n'est pas une commande native unix (veuillez me corriger si je me trompe).
Tiago Cardoso
10

Puisqu'il existe des dizaines de façons de le faire, voici une autre:

tree -d -L 1 -i --noreport
  • -d: répertoires
  • -L: profondeur de l'arbre (d'où 1, notre répertoire de travail)
  • -i: pas de retrait, uniquement les noms en caractères d'imprimerie
  • --noreport: ne rapporte pas d'informations à la fin de la liste des arbres
alleen1
la source
Et merci d'avoir expliqué les commutateurs. Stack Overflow est une question de réponses, j'apprécie toujours quand les gens vous aiment avec une explication vs "il suffit de lire l'entrée homme!" <- ce n'est pas une réponse.
fusion27
Pour commencer à partir de la ligne 2 (sautez la ligne avec seulement un point):tree -d -L 1 -i --noreport | tail -n +2
adius
Il s'agit de la solution la mieux classée qui répertorie les répertoires à liens souples et le fait de manière utile, en les exposant sous forme de lien. Je préfère la variation:tree -C -d -L 1 -i --noreport | tail -n+2
Amnon Harel
9
ls -l | grep '^d'

Vous pouvez créer un alias et le placer dans le fichier de profil

alias ld="ls -l| grep '^d'"
somesh chandra
la source
1
les liens ne sont pas affichés avec cette commande. Et un lien peut être un fichier ou un répertoire. Exemple: lrwxrwxrwx 1 root root 21 avril 15 17:38 cron -> / lib / init / upstart-job.
c-toesca
7
find . -maxdepth 1 -type d -name [^\.]\* | sed 's:^\./::'
mda
la source
☀ trouver. -maxdepth 1 -type d -name [^ \.] * | sed 's: ^ \ ./ ::' zsh: aucune correspondance trouvée: [^.] *
Michael Cole
6

Afin de lister les répertoires dans le répertoire de travail actuel, vous ls -d */pouvez utiliser. Et si vous devez lister les répertoires cachés, utilisez cette commande ls -d .*/

kvivek
la source
6

utilisez ceci pour obtenir une liste de répertoires

ls -d */ | sed -e "s/\///g"
Lakshmi
la source
ls -d <chemin-répertoire-personnalisé> | sed -e "s / \ /// g" ne fonctionne pas ..un indice?
Dhwanit
Je vous remercie! Je voulais juste la liste des répertoires sans toutes les autorisations et cela a fait l'affaire. :)
codingjeremy
5

find specifiedpath -type d

Si vous ne voulez pas récuser dans les sous-répertoires, vous pouvez le faire à la place:

find specifiedpath -type d -mindepth 1 -maxdepth 1

Notez que les répertoires "dot" (dont le nom commence par .) seront également répertoriés; mais pas les répertoires spéciaux .non plus ... Si vous ne voulez pas de répertoires "dot", vous pouvez simplement greples sortir:

find specifiedpath -type d -mindepth 1 -maxdepth 1 | grep -v '^\.'

DomQ
la source
1
Upvote pour avoir mentionné mindepthde se débarrasser de .! 😁
adius
5

La réponse dépendra de votre shell .

Dans zsh, par exemple, vous pouvez effectuer les opérations suivantes:

echo *(/)

Et tous les répertoires du répertoire de travail actuel seront affichés.

Voir man zshexpnpour plus d'informations.

Une approche alternative serait d'utiliser find(1), qui devrait fonctionner sur la plupart des versions Unix:

find . -maxdepth 1 -type d -print  

find(1)a de nombreuses utilisations, donc je recommanderais certainement man find.

Johnsyweb
la source
4

Vous pouvez utiliser la treecommande avec son dcommutateur pour accomplir cela.

% tree -d tstdir
tstdir
|-- d1
|   `-- d11
|       `-- d111
`-- d2
    `-- d21
        `-- d211

6 directories

voir man treepour plus d'informations.

slm
la source
Je n'ai pas downvote, juste eu la même question. Il semble que votre réponse soit une dupe des échos, c'est peut-être pourquoi?.
Louis Waweru
1
@Louis - merci, je n'ai même jamais remarqué sa mention tree. Eh bien, mon intention n'était pas de voler le tonnerre.
slm
voter pour la visualisation de ce que fait l'arbre
Andrejs
Je crois que les downvotes sont parce que c'est la même réponse que stackoverflow.com/a/3667405/523742
Tiago Cardoso
@TiagoCardoso - le mien est antérieur à un an sur deux.
slm
2

Si j'ai ce répertoire:

ls -l

lrwxrwxrwx  1 nagios nagios     11 août   2 18:46 conf_nagios -> /etc/icinga
-rw-------  1 nagios nagios 724930 août  15 21:00 dead.letter
-rw-r--r--  1 nagios nagios  12312 août  23 00:13 icinga.log
-rw-r--r--  1 nagios nagios   8323 août  23 00:12 icinga.log.gz
drwxr-xr-x  2 nagios nagios   4096 août  23 16:36 tmp

Pour obtenir tous les répertoires, utilisez -L pour résoudre les liens:

ls -lL | grep '^d'

drwxr-xr-x 5 nagios nagios   4096 août  15 21:22 conf_nagios
drwxr-xr-x 2 nagios nagios   4096 août  23 16:41 tmp

Sans -L:

ls -l | grep '^d'

drwxr-xr-x 2 nagios nagios   4096 août  23 16:41 tmp

Le répertoire conf_nagios est manquant.

c-toesca
la source
2
### If you need full path of dir and list selective dir with "name" of dir(or dir_prefix*):
find $(pwd) -maxdepth 1 -type d -name "SL*"
Surya
la source
1

Cela a fonctionné pour moi:

`ls -F | grep /`

(Mais je passe echo */comme mentionné par @nos)

FractalSpace
la source
1

Voici une autre solution qui affiche les répertoires liés. Je le préfère légèrement car c'est un sous-ensemble de la sortie ls -l "normale":

ls -1d */ | rev | cut -c2- | rev | xargs ls -ld --color=always
Amnon Harel
la source
1

En bash:

ls -d */

Liste tous les répertoires

ls -ld */

listera tous les répertoires sous forme longue

ls -ld */ .*/

listera tous les répertoires, y compris les répertoires cachés, sous une forme longue.


Je suis récemment passé à zsh (MacOS Catalina) et j'ai constaté que:

ls -ld */ .*/

ne fonctionne plus si le répertoire courant ne contient aucun répertoire caché.

zsh: no matches found: .*/

Il imprimera l'erreur ci-dessus, mais échouera également à imprimer les répertoires.

ls -ld *(/) .*(/)

Échoue également de la même manière.

Jusqu'à présent, j'ai constaté que ceci:

ls -ld */;ls -ld .*/

est une solution de contournement décente. L' ;est un séparateur de commande. Mais cela signifie que s'il n'y a pas de répertoires masqués, il répertorie les répertoires et affiche toujours l'erreur pour aucun répertoire masqué:

foo
bar
zsh: no matches found: .*/

lsest la commande shell pour le contenu de la liste de répertoire en cours
-lest le drapeau pour indiquer que vous voulez à la liste à Longford (un élément par ligne + un tas d'autres informations cool)
-dest le drapeau à la liste tous les répertoires « sous forme de fichiers » et non récursive
*/est l'argument 'lister tous les fichiers se terminant par une barre oblique'
*est une simple commande regex pour "n'importe quoi", donc */demande au shell de lister "tout ce qui se termine par '/'"

Voir man lspour plus d'informations.


Je mets ceci:

alias lad="ls -ld */;ls -ld .*/"

dans mon .zshrc, et cela semble bien fonctionner.

REMARQUE: j'ai également découvert que

ls -ld .*/ 2> /dev/null

ne fonctionne pas, car il imprime toujours sterr sur le terminal. Je mettrai à jour ma réponse si / quand je trouve une solution.

DryLabRebel
la source
0

du -d1est peut-être l'option la plus courte. (Tant que vous n'avez pas besoin de diriger l'entrée vers une autre commande.)

Mohan
la source
0

Pour répertorier uniquement les répertoires d'un chemin spécifié, tapez simplement ls -l | grep drw

Loui
la source
Cela peut inclure des fichiers, le cas échéant drw, et exclurait tous les répertoires qui ne sont ni lisibles ni inscriptibles par le propriétaire. grep ^dfonctionne mieux.
Tom Zych
0

Liste longue des répertoires

  • ls -l | grep '^ d'
  • ls -l | grep "^ d"

Liste des répertoires
- ls -d * /

Athi
la source
Avez-vous une bonne raison de dupliquer les réponses déjà existantes?
Maxim Sagaydachny