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?


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


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

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


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 *(/)

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

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'"

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:^\./::'

☀ 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 .*/


6

utilisez ceci pour obtenir une liste de répertoires

ls -d */ | sed -e "s/\///g"

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 '^\.'


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.


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.


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.


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*"

1

Cela a fonctionné pour moi:

`ls -F | grep /`

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


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

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.


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.)


0

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


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 * /


Avez-vous une bonne raison de dupliquer les réponses déjà existantes?
Maxim Sagaydachny
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.