Cette commande répertorie les répertoires du chemin actuel: ls -d */
Que fait exactement le motif */
?
Et comment pouvons-nous donner le chemin absolu dans la commande ci-dessus (par exemple ls -d /home/alice/Documents
) pour répertorier uniquement les répertoires de ce chemin?
-d
signifie réellement.Réponses:
*/
est un modèle qui correspond à tous les sous-répertoires du répertoire en cours (*
correspondrait à tous les fichiers et sous - répertoires; le/
restreint aux répertoires). De même, pour répertorier tous les sous-répertoires sous / home / alice / Documents, utilisezls -d /home/alice/Documents/*/
la source
*/
cela ne correspondra à aucun dossier caché. Pour les inclure, spécifiez-les explicitement commels -d .*/ */
ou définissez l'dotglob
option dans Bash.ls
sur quelque chose qui n'existe pas.shopt -s nullglob
ls */
se développerait justels
, ce qui répertorierait tous les fichiers dans le répertoire en cours. Je suis sûr que ce n'est pas ce que vous voulez dans ce cas.Quatre façons d'y parvenir, chacune avec un format de sortie différent
1. Utilisation
echo
Exemple:
echo */
,echo */*/
Voici ce que je suis:
2. Utilisation
ls
uniquementExemple:
ls -d */
voici exactement ce que j'ai obtenu:
Ou sous forme de liste (avec des informations détaillées):
ls -dl */
3. Utilisation
ls
etgrep
Exemple:
ls -l | grep "^d"
voici ce que j'ai obtenu:4. Bash Script (non recommandé pour les espaces contenant des noms de fichiers)
Exemple:
for i in $(ls -d */); do echo ${i%%/}; done
voici ce que j'ai obtenu:
Si vous aimez avoir '/' comme caractère de fin, la commande sera:
for i in $(ls -d */); do echo ${i}; done
la source
3
était sensiblement plus lent que les autres pour moi. Dans le répertoire que j'ai testé:1
.012s,2
.016s,3
.055s ,4
.021s.1
est mon préféré.time
la fonction Unix. /// Je suis d'accord,echo */
c'est plus intelligent quels -d */
.1.
option causera des douleurs importantes lors du traitement des noms de dossiers qui ont des espaces.J'utilise:
Cela crée une seule colonne sans barre oblique de fin - utile dans les scripts.
Mes deux centimes.
la source
-1
option pourls
sera également affichée au format à colonne uniquels -1 -d */
.-1
toujours une barre oblique de fin pour chaque entrée..bashrc
alias, comment puis-je l'ajouter'/'
?'\/'
| sed -e 's-/$--'
Pour tous les dossiers sans sous-dossiers:
Pour tous les dossiers avec sous-dossiers:
la source
find /home/alice/Documents -maxdepth 1 -mindepth 1 -type d
sinon vous vous incluez/home/alice/Documents
. Pour inclure des liens symboliques vers des répertoires,-L
4 (plus) Options fiables.
Un astérisque sans guillemets
*
sera interprété comme un motif (glob) par le shell.Le shell l'utilisera dans l'extension du nom de chemin.
Il générera ensuite une liste de noms de fichiers correspondant au modèle.
Un simple astérisque correspondra à tous les noms de fichiers dans le PWD (répertoire de travail actuel).
Un modèle plus complexe
*/
qui correspondra à tous les noms de fichiers se terminant par/
.Ainsi, tous les répertoires. C'est pourquoi la commande:
1.- écho.
sera étendu (par le shell) à
echo
tous les répertoires du PWD.Pour tester cela: créez un répertoire (
mkdir
) nommé comme test-dir, etcd
dans celui-ci:Créez des répertoires:
La commande
echo ./*/
restera fiable même avec des fichiers nommés étranges:Mais les espaces dans les noms de fichiers rendent la lecture un peu déroutante.
Si au lieu de
echo
, nous utilisonsls
, le shell est toujours ce qui élargit la liste des noms de fichiers. Le shell est la raison pour obtenir une liste de répertoires dans le PWD. L'-d
option permettant dels
répertorier l'entrée de répertoire actuelle au lieu du contenu de chaque répertoire (comme présenté par défaut).Cependant, cette commande est (quelque peu) moins fiable. Il échouera avec les fichiers nommés étranges répertoriés ci-dessus. Il s'étouffera avec plusieurs noms. Vous devez effacer un par un jusqu'à ce que vous trouviez ceux qui ont des problèmes.
2.- ls
Le GNU
ls
acceptera la--
touche "fin des options" ( ).3.-printf
Pour répertorier chaque répertoire dans sa propre ligne (dans une colonne, similaire à ls -1), utilisez:
Et, encore mieux, nous pourrions supprimer la fin
/
:Une tentative comme celle-ci:
Échouera le:
ls -d */
) comme déjà indiqué ci-dessus.IFS
.IFS
).4.- Fonction
Enfin, l'utilisation de la liste d'arguments à l'intérieur d'une fonction n'affectera pas la liste d'arguments du shell en cours d'exécution. Simplement:
présente cette liste:
Ces options sont sûres avec plusieurs types de noms de fichiers impairs.
la source
La
tree
commande est également assez utile ici. Par défaut, il affichera tous les fichiers et répertoires à une profondeur complète, avec quelques caractères ascii montrant l'arborescence des répertoires.Mais si nous voulions obtenir uniquement les répertoires, sans l'arborescence ascii, et avec le chemin complet du répertoire actuel, vous pourriez faire:
Les arguments étant:
Et si vous voulez ensuite le chemin absolu, vous pouvez commencer par spécifier le chemin complet vers le répertoire courant:
Et pour limiter le nombre de sous-répertoires, vous pouvez définir le niveau maximum de sous-répertoires avec
-L level
, par exemple:Plus d'arguments peuvent être vus avec man tree
la source
Au cas où vous vous demandez pourquoi la sortie de 'ls -d * /' vous donne deux barres obliques de fin, comme:
c'est probablement parce que quelque part votre fichier de configuration shell ou session alias la commande ls vers une version de ls qui inclut l'indicateur -F. Cet indicateur ajoute un caractère à chaque nom de sortie (ce n'est pas un fichier ordinaire) indiquant le genre de chose. Ainsi, une barre oblique est celle correspondant au modèle '* /', et l'autre barre oblique est l'indicateur de type ajouté.
Pour vous débarrasser de ce problème, vous pouvez bien sûr définir un alias différent pour ls. Cependant, pour ne pas invoquer temporairement l'alias, vous pouvez ajouter la barre oblique inverse à la commande:
\ ls -d * /
la source
Je viens de l'ajouter à mon
.bashrc
fichier (vous pouvez également le taper sur la ligne de commande si vous en avez besoin / ne le souhaitez que pour une session)alors lsd produira le résultat souhaité.
la source
ls
Solution réelle , y compris les liens symboliques vers les répertoiresDe nombreuses réponses ici n'utilisent pas réellement
ls
(ou ne l'utilisent que dans le sens trivial dels -d
, tout en utilisant des caractères génériques pour la correspondance réelle du sous-répertoire. Une vraiels
solution est utile, car elle permet l'utilisation d'ls
options pour l'ordre de tri, etc.Hors liens symboliques
Une solution utilisant
ls
a été donnée, mais elle fait quelque chose de différent des autres solutions en ce qu'elle exclut les liens symboliques vers les répertoires:(éventuellement passe à travers
sed
ouawk
pour isoler les noms de fichiers)Y compris les liens symboliques
Dans le cas (probablement plus courant) où des liens symboliques vers des répertoires devraient être inclus, nous pouvons utiliser l'
-p
option dels
, ce qui fait qu'il ajoute un caractère barre oblique aux noms des répertoires (y compris les liens symboliques):ou, en supprimant les barres obliques de fin:
Nous pouvons ajouter des options au
ls
besoin (si une longue liste est utilisée, la-1
n'est plus requise).Remarque: si nous voulons des barres obliques de fin, mais que nous ne voulons pas qu'elles soient mises en évidence par
grep
, nous pouvons supprimer de manière piratée la mise en surbrillance en rendant la partie correspondante de la ligne vide:la source
S'il n'est pas nécessaire que le répertoire caché soit répertorié, je propose:
Et si des répertoires cachés doivent être répertoriés, utilisez:
OU
la source
awk
, consultez cette réponsepour afficher les listes de dossiers sans
/
la source
ls -d1 */ | tr -d "/"
set -- */; printf "%s\n" "${@%/}"
Voici ce que j'utilise
ls -d1 /Directory/Path/*;
la source
ls -d1 /Directory/Path/*/
Pour répertorier uniquement les répertoires :
pour répertorier uniquement les fichiers :
ou vous pouvez aussi faire comme: ls -ld * /
la source
Testez si l'élément est un répertoire avec
test -d
:la source
*/
est un modèle de correspondance de nom de fichier qui correspond aux répertoires du répertoire actuel.Pour ne lister que les répertoires, j'aime cette fonction:
Mettez-le dans votre .bashrc.
Exemples d'utilisation:
REMARQUE: il se cassera si vous utilisez l'
-i
option. Voici un correctif pour cela:la source
Pour info, si vous souhaitez imprimer tous les fichiers sur plusieurs lignes, vous pouvez faire un
ls -1
qui imprimera chaque fichier sur une ligne distincte. fichier1 fichier2 fichier3la source
Une simple liste du répertoire courant, ce serait:
Voulez-vous qu'il soit trié et propre?
la source
Essaye celui-là. Cela fonctionne pour toutes les distributions Linux.
la source
ls -l | grep '^d' | awk '{print $9}'
One-liner pour lister les répertoires uniquement "d'ici".
Avec le nombre de fichiers.
la source
J'ai résolu partiellement avec:
Eh bien, cela me réduit, la partie maire :)
la source
Ajouter pour faire le tour complet, pour récupérer le chemin de chaque dossier, utilisez une combinaison de la réponse d'Albert ainsi que de Gordans qui devrait être assez utile.
Production:
la source
Utilisation de Perl:
la source
Voici ce que j'utilise pour répertorier uniquement les noms de répertoire:
la source
Pour répondre à la question d'origine, cela
*/
n'a rien à voir avec enls
soi; cela se fait par le shell / Bash, dans un processus appelé globbing .C'est pourquoi
echo */
etls -d */
sortir les mêmes éléments. (L'-d
indicateur faitls
sortir les noms de répertoires et non le contenu des répertoires.)la source
Voici une variante utilisant l'arborescence qui ne sort les noms de répertoire que sur des lignes séparées, oui c'est moche mais bon, ça marche.
ou avec awk
C'est probablement mieux cependant et conservera le
/
nom du répertoire après.la source
O / P (Sur ma machine) -
La sortie ci-dessus peut être affinée davantage en utilisant la découpe.
la source
La commande la plus courte jamais (en fait un hack) pour lister uniquement les répertoires. Tapez le chemin absolu ou le chemin relatif du répertoire d'intérêt et appuyez sur Entrée pour entrer dans le répertoire d'intérêt. Maintenant, tapez
cd
et appuyez sur la touche de tabulation . Seuls les répertoires sont affichés maintenant.user@ubuntu:~/Desktop$cd <tab key>
La commande ci-dessus ne devrait désormais afficher que les dossiers du bureau . Le plus court en effet.
la source