Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SHELL] Lister uniquement les répertoires

Sans . ni ..

Sujet résolu
3 juillet 2008 à 16:20:04

Bonjour à tous,
J'ai beau lire et relire le man, je ne vois pas comment faire. :euh:
Je veux lister avec ls dans le répertoire courant les seuls répertoires. Rien d'autre , sans référence au courant et parent (donc sans . ni ..). :o
C'est moi ou ... o_O
Quelqu'un pouraait-il m'éclairer ? Merci d'avance
  • Partager sur Facebook
  • Partager sur Twitter
3 juillet 2008 à 16:49:32

Salut,

Seulement avec ls je ne vois pas, par contre tu dois pouvoir t'arranger avec quelques pipes (grep, tr ,cut sans doute), ou un petit script ( l=$(ls); for..; if [ -d filename ]..).
A voir, sil y a mieux..
  • Partager sur Facebook
  • Partager sur Twitter
3 juillet 2008 à 17:04:03

Plop !

d'après le man, ça devrait être ls -dA. Mais ayant testé, ça n'a pas l'air de marcher (où est mon erreur ?). Je contourne donc le problème avec ls -d */ :-°
  • Partager sur Facebook
  • Partager sur Twitter
3 juillet 2008 à 17:12:42

Moui...
Etrange qu'un outil aussi puiisant ne dispose pas d'une option "ad hoc".
Merci cependant pour vos réponses.
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
3 juillet 2008 à 17:24:34

Pour lister uniquement les répertoires, il y a find :
find . -maxdepth 1 -type d

Le problème c'est que . sera dans la liste, ce qui n'est pas ce que tu veux apparemment.
  • Partager sur Facebook
  • Partager sur Twitter
3 juillet 2008 à 17:38:32

Oui, effectivement j'ai été contraint d'utiliser find comme cela :

find [0-9a-zA-Z]* -type d


Mais je voulais plus simple. Le but était d'utiliser "ls" dans une condition.

  • Partager sur Facebook
  • Partager sur Twitter
3 juillet 2008 à 20:36:01

Il me semble que K-Phoen a donné une solution viable avec ls, non ?
Je viens de faire deux-trois tests, et en BaSH, ceci est (presque1) fonctionnel :
ls -d dossier/{*,.[^.]*}/

Cependant c'est du BaSH et non du SH simple. Il est facile de refaire la même chose en SH simple, pour peu que garder '.' et '..' ne dérange pas :
ls -d dossier/*/ dossier/.*/



Et sinon, la solution de Zulon est très bonne. Sure et efficace.


Mais vu comme tu l'utilise, je pense qu'un simple :
ls -d */
(proposé par K-Phoen) serait très bien, non ? (sauf si tu veux vraiment les sous-dossiers, bien entendu)


Sinon, il y a une troisième solution : tu écris une fonction/script qui te fait ça :
liste_reperoires()
{
  [ -z "$1" ] && return 1
  
  ls -A "$1" | while read d; do
    [ -d "$1/$d" ] && echo "$1/$d"
  done
}

C'est sur, efficace et compatible SH.
Après, c'est à toi de voir.


Cordialement,
Nab

1 les dossiers dont le nom commence par '..' ne seront pas listés.
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
4 juillet 2008 à 8:58:16

Je viens de me rendre compte qu'il y a une solution encore plus simple -_-
ls -Ad */

Et voilà, tu as tous les sous-dossiers, même cachés, mais pas '.' et '..', du répertoire courant. Pour un autre dossier, facile aussi :
ls -Ad /path/to/dir/*/
  • Partager sur Facebook
  • Partager sur Twitter
4 juillet 2008 à 14:20:41

Merci à tous pour vos réponses :p

Bon chez moi (en SH) un ls -Ad */ équivaut à un ls -d */ comme l'indique la copie console ci-dessous :

vas-y~/Test$ ls -Ad */
4/  c/  txt/
vas-y~/Test$ ls -d */
4/  c/  txt/
vas-y~/Test$


En fait, je voulais un résultat qui permette un affichage sans les slash. Bref, un affichage tout
simple... bof, pas grave :o
Merci encore.
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
4 juillet 2008 à 14:46:57

ls -Ad n'est pas équivalent à ls -d. C'est juste que dans le dossier que tu listes, il n'y a pas de fichiers cachés.
Si tu veux virer les slashes, tu peux faire un script comme ceci :
ls -Ad */ | sed 's,/$,,g'
  • Partager sur Facebook
  • Partager sur Twitter
4 juillet 2008 à 16:02:28

Extrait du man ls :

-A, --almost-all do not list implied . and ..
-d, --directory list directory entries instead of contents, and do not dereference symbolic links.

donc :
-A, ne pas inclure dans la liste . et ..
-d, lister les noms de répertoires plutôt que leur contenu et ne pas déférencer les liens symboliques

Les fichiers cachés ne sont pas concernés la preuve :

vas-y~/Test$ ls -a
.  ..  4  bidule2  c  .jesuispaslanonplus  .pasla  qcm4-3  txt
vas-y~/Test$ ls -Ad */
4/  c/  txt/
vas-y~/Test$ ls -d */
4/  c/  txt/
vas-y~/Test$


Normal on demande d'afficher tous les dossiers sauf . et ..
L'option -d affiche les noms des répertoires, or . et .. ne sont pas des noms. Pourtant la commande ls -d seule affiche .

vas-y~/Test$ ls -d
.
vas-y~/Test$


Allez comprendre... :(
Il n'empeche cependant qu'aucune option ou combinaison d'options de ls permet d'obtenir une liste des répertoires sans . ni .. en affichant leur nom et rien que leur nom.
A+


  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
4 juillet 2008 à 16:07:11

Pour le "ls -d" seul, c'est normal : quand tu ne spécifies pas de nom de fichier, il travaille sur . par défaut.
Mais sinon, en quoi est-ce grave que ls seul affiche le / au bout du nom du dossier ? En le couplant avec sed par exemple, c'est résolu.
  • Partager sur Facebook
  • Partager sur Twitter
4 juillet 2008 à 16:13:13

Citation : Zulon

Mais sinon, en quoi est-ce grave que ls seul affiche le / au bout du nom du dossier ? En le couplant avec sed par exemple, c'est résolu.



Rien n'est jamais grave... ^^
J'ai choisi la programmation parce que je suis un gros fainéant. :lol:
Si je peux m'éviter des "grep - cut - sed" et autres "douceurs" et bien j'évite :D
Allez bon, la suite cuisto !!
  • Partager sur Facebook
  • Partager sur Twitter
1 juin 2017 à 11:02:33

var='./' # change './'  with the folder you wan list inside

while [ `ls -Ad $var|wc -l` -gt 0 ] ; do  ls -Ad $var*/; var="$var*/"; done|sort

  • Partager sur Facebook
  • Partager sur Twitter
19 novembre 2017 à 11:46:20

Comment afficher seulement les fichiers caches dans un repertoire !?!!

  • Partager sur Facebook
  • Partager sur Twitter
2 décembre 2017 à 16:43:14

Ecrire un script Shell copyall qui, à partir d’un fichier donné généré par la commande ls, copie les fichiers mentionnés dans le fichier ls vers un répertoire spécifié.
Si le répertoire de destination n’existe pas, il sera créé (après éventuellement confirmation).
Copyall comporte aussi une option "overwrire o/n" pour les fichiers existants et indique le nombre de fichiers copiés (et éventuellement le nombre de fichiers pour lesquels la copie n’a pas été possible). ? *
j'ai besoin d'aide STp ! 
  • Partager sur Facebook
  • Partager sur Twitter
2 décembre 2017 à 17:56:59

Bonjour, ce sujet date de 2008, pour vos nouvelles questions merci de créer un nouveau sujet en fournissant à la communauté votre code en utilisant le bouton code </> et en choisissant le bon langage ce qui active la coloration syntaxique.

Je ferme ce déterrage.

  • Partager sur Facebook
  • Partager sur Twitter