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?
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
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
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
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
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:^\./::'
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 .*/
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:
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.
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.
Réponses:
Essayez ceci
ls -d */
pour lister les répertoires dans le répertoire courantla source
ls -al | grep '^d'
- c'est beaucoup plus succinct.*/
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'-F
option dels
n'est pas utilisée. Similaire au comportementls *php
et à la façon dont il affiche tous les fichiers se terminant parphp
dans un répertoire.echo */
la même chose aussiEssaye ça:
la source
ls
solutions suggérées , ilfind
est 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.find * -maxdepth 0 -type d
.find
l' option-print0
ou-exec
.find
ne fait généralement que produire les dossiers en profondeur 1.Le suivant
filtre essentiellement l'expansion de '*', c'est-à-dire toutes les entrées du répertoire courant, par la
-type d
condition.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 pointla source
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:
la source
tree
?tree
n'est pas installée par défaut (bien qu'elle soit dans les référentiels).tree
commande n'est pas une commande native unix (veuillez me corriger si je me trompe).Puisqu'il existe des dizaines de façons de le faire, voici une autre:
la source
tree -d -L 1 -i --noreport | tail -n +2
tree -C -d -L 1 -i --noreport | tail -n+2
Vous pouvez créer un alias et le placer dans le fichier de profil
la source
la source
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 commandels -d .*/
la source
utilisez ceci pour obtenir une liste de répertoires
la source
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 simplementgrep
les sortir:find specifiedpath -type d -mindepth 1 -maxdepth 1 | grep -v '^\.'
la source
mindepth
de se débarrasser de.
! 😁La réponse dépendra de votre shell .
Dans
zsh
, par exemple, vous pouvez effectuer les opérations suivantes:Et tous les répertoires du répertoire de travail actuel seront affichés.
Voir
man zshexpn
pour plus d'informations.Une approche alternative serait d'utiliser
find(1)
, qui devrait fonctionner sur la plupart des versions Unix:find(1)
a de nombreuses utilisations, donc je recommanderais certainementman find
.la source
Vous pouvez utiliser la
tree
commande avec sond
commutateur pour accomplir cela.voir
man tree
pour plus d'informations.la source
tree
. Eh bien, mon intention n'était pas de voler le tonnerre.Si j'ai ce répertoire:
ls -l
Pour obtenir tous les répertoires, utilisez -L pour résoudre les liens:
ls -lL | grep '^d'
Sans -L:
ls -l | grep '^d'
Le répertoire conf_nagios est manquant.
la source
la source
Cela a fonctionné pour moi:
(Mais je passe
echo */
comme mentionné par @nos)la source
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":
la source
En bash:
Liste tous les répertoires
listera tous les répertoires sous forme longue
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:
ne fonctionne plus si le répertoire courant ne contient aucun répertoire caché.
Il imprimera l'erreur ci-dessus, mais échouera également à imprimer les répertoires.
Échoue également de la même manière.
Jusqu'à présent, j'ai constaté que ceci:
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é:ls
est la commande shell pour le contenu de la liste de répertoire en cours-l
est le drapeau pour indiquer que vous voulez à la liste à Longford (un élément par ligne + un tas d'autres informations cool)-d
est 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 ls
pour 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.
la source
du -d1
est peut-être l'option la plus courte. (Tant que vous n'avez pas besoin de diriger l'entrée vers une autre commande.)la source
Pour répertorier uniquement les répertoires d'un chemin spécifié, tapez simplement ls -l | grep drw
la source
drw
, et exclurait tous les répertoires qui ne sont ni lisibles ni inscriptibles par le propriétaire.grep ^d
fonctionne mieux.Liste longue des répertoires
Liste des répertoires
- ls -d * /
la source