Est-il possible d’ ls
afficher uniquement des répertoires au lieu de fichiers et de répertoires?
De la page de manuel:
-d, --directory
list directory entries instead of contents, and do not derefer‐
ence symbolic links
Donc, si je le tape dans le /
répertoire, je m'attends à ne voir que des répertoires. Au lieu de cela, il montre "."
$ cd /
$ ls -d
.
Je m'attendais ls -d
à me montrer ceci:
$ ls -d
bin data home opt sbin sys var
boot dev lib media proc selinux tmp
cdrom etc lost+found mnt root srv usr
Est-il possible d’ ls
afficher uniquement des répertoires au lieu de fichiers et de répertoires?
-d
ne veut pas dire lister seulement les répertoires, cela veut dire ne pas lister le contenu des répertoires. Essayez de taperls */
et vous verrez le contenu de tous les répertoires.ldir
lisé àls -d */
mon.bashrc
pour vous faciliter la tâche ...Réponses:
Vos attentes sont basées sur DOS Think / Windows Think et sont fausses. Sur MS-DOS, Windows et même sur quelques autres systèmes d'exploitation IBM / Microsoft, le développement des caractères génériques est effectué par la commande elle-même. Des éléments tels que l'
/a
option de ladir
commande agissent comme des filtres d'attributs lors du développement des caractères génériques.dir
étend les caractères génériques tels que ceux*
que l'interpréteur de commande lui transmet tels quels, et si/a
spécifié, il applique les filtres appropriés à ce qui est renvoyé. (Sur certains systèmes d'exploitation, les filtres d'attributs peuvent être attribués à l'appel système pour énumérer un répertoire et le noyau du système d'exploitation, ou ses pilotes de système de fichiers, les applique eux-mêmes.)Sous Unices et Linux, l’extension des caractères génériques est effectuée par le shell et n’est pas liée aux autorisations. Quand, dans le répertoire racine, vous faites
ce que la
ls
commande elle-même reçoit du shell (quelque chose comme)L’ option
-d
/ désactive ce qui se passe normalement ensuite . Ce qui se passe ensuite ensuite, c’est que chacun de ses arguments est examiné, qu’il s’agit de répertoires et qu’il décide d’énumérer son contenu. Pour les arguments qui nomment des fichiers, il n’imprime que les informations relatives au fichier lui-même. Avec l' option, les répertoires sont traités comme des fichiers. Donc, imprime les informations pour chacun des répertoires qui sont passées en tant qu'arguments, exactement comme s'il s'agissait de fichiers.--directory
ls
-d
ls
Donc, ce
-d
n'est pas une option "imprimer uniquement les répertoires". En fait, non seulement cette option n’existe pas; il ne peut y avoir une telle option. L’exploitation des caractères génériques est effectuée par le shell et (dans un POSIXsh
au moins), il n’ya aucun moyen de demander au shell de vérifier les bits d’autorisation et de type de fichier lorsqu’il se développe*
dans une liste de noms. Pour obtenir une liste des noms de répertoires uniquement, il est nécessaire d'utiliser lafind
commande, comme expliqué parztank1013
ou d'utiliser le truc selon lequel un chemin d'accès se terminant par une barre oblique implique l'entrée du répertoire.
, comme expliqué parJin
. (Jin
L'astuce finit avec lals
commande recevant les argumentsparce que le modèle
*/
fait en réalité correspondre les chemins d'accès avec deux composants, le second étant vide, et ne fait donc pas tout à fait ce qui était souhaité. En particulier, les liens symboliques pointant vers des répertoires seront traités comme s'il s'agissait de répertoires.)Le comportement de
ls -d
sans*
est une simple extension de ce qui précède. Il suffit simplement de savoir une dernière chose à propos dels
: quand aucun argument n’est donné, cela suppose un argument par défaut de.
. Désormais, sans cette-d
option, le comportement susmentionné conduit au contenu du répertoire nommé par.
énumération et à l'affichage des informations relatives à son contenu. Avec l'-d
option, le répertoire.
est traité comme s'il s'agissait d'un fichier et ses propres informations sont affichées, plutôt que son contenu énuméré.la source
dir /s *.txt
[sans recourir à des guillemets génériques pour trouver]ls
pourrait avoir une option pour filtrer les fichiers ou les répertoires, et cela ne s’exclut pas mutuellement avec le développement du shell. Il n'y a pas de condition de concurrence dans ls: il peut le filtrer car il statistiques normalement les fichiers. (Il y a déjà une course entre le shell shell et ls, FWIW.) Je pense que l'expansion du shell n'est qu'une partie de la raison: l'expansion du shell (et le filtrage en général) n'est pas implémentée dans ls car elle devrait être implémentée à nouveau dans cp , mv, etc. Unix est un "faire une chose et bien le faire". Si vous avez besoin d'un filtrage avancé, il existe des outils pour cela.ls -p
option ajoute un/
symbole aux répertoires uniquement. Il n'y a aucune raison de ne pas étendre les capacités d'impression de sortie avec quelque chose qui ne produit que celles-ci (plutôt quels -p | grep /
).ls --only-directories .
option pourrait éventuellement être ajoutéels
.Vous pouvez utiliser
ls -d */
ouls -d .*/
pour les répertoires cachés.la source
Essaye ça
pour obtenir uniquement des répertoires sous votre emplacement actuel.
la source
vous pourriez aussi aimer
qui répertorie proprement tous les répertoires et sous-répertoires avec une représentation graphique de la structure arborescente.
la source
tree -dL 1
Si vous voulez voir uniquement les répertoires avec des détails comme l'
ls -l
option (ELL), vous pouvez utiliser ci-dessous:Vous trouverez ci-dessus uniquement les détails que vous obtenez avec l'
-l
option.la source
find -maxdepth 1 -type d -exec ls -d {} +
pour obtenir une sortie auls
format habituel .Si vous voulez faire le travail d'une autre manière, essayez ceci:
ls -l | grep ^d
Bien qu'un seul outil soit suffisant dans cette situation. Pipe Line est toujours là pour vous aider. J'aime la flexibilité sous Linux, ce que je vous souhaite.
la source
J'espère que cela rectifiera votre besoin. La commande ci-dessous ne listera que les répertoires d'un chemin donné.
Exemple:
la source