Forum Programmation.shell Majuscule arborescence et repertoire

Posté par  .
Étiquettes : aucune
0
21
nov.
2005
Bonjour!

Voilà un problème qu'un pote est venu me poser hier :

Comment mettre en majuscule tout les repertoires d'une arborescence ?

Ca a l'air simple vu comme ça ... on se dit, un coup de find, un coup de tr, de rename ou de sed ... mais nan, j'vous promet que c'est pas si simple. (en tout cas, j'ai pas trouvé de solution propre).

Mon pote c'est lancé dans un script, mais moi je reste convaincu qu'il y a moyen de faire ça en 1 ligne ... seulement, je la trouve pas cette ligne :/

Merci de votre aide :)

PS : voilà ou j'en suis :


$ find . -depth -mindepth 1 -type d -exec rename 'y/a-z/A-Z/' {} \;


Mais il ne peut pas renommer toute une arborescence d'un coup. Faudrait arriver à prendre juste le dernier rep et le mettre en majuscule ... bref, je galère :/
  • # une arbo c'est .. .

    Posté par  . Évalué à 1.

    une arbo c'est quoi ? tout les reps dispo, et tout les sous rep dispo et ainsi de suite ?

    alors pourquoi ne pas enlever l'option mindepth ? ca te sortira tout les reps existants sous ".", non ?
    • [^] # Re: une arbo c'est .. .

      Posté par  . Évalué à 1.

      J'ai mis mindepth pour ne pas faire le repertoire courant, sinon find me le ressort.

      un arbo, c'est les repertoires + les sous-repertoires de ces repertoires et ainsi de suite.

      genre t'as :

      /ici/plop/pouet/yupi/
      /ici/baname/melon/fraise

      tu te met dans ici, tu lances ton truc et ça te sort :

      /ici/PLOP/POUET/YUPI/
      /ici/BANAME/MELON/FRAISE/
      • [^] # Re: une arbo c'est .. .

        Posté par  . Évalué à 1.

        ah oui, excuse moi, j'ai confondu avec maxdepth :>

        en fait j'ai completement rien compris au probleme, le probleme c'est que ca renomme pas la fin du chemin comme ca devrait ? au pire tu fais un cd pour chaque, et tu renommes tout les repertoires dans le rep ou tu es, avec un second find imbriqué, un peu sale peut etre :]

        genre
        find . -depth -mindepth 1 -type d -exec "cd {} && find . -maxdepth 1 -mindepth 1 -type d -exec "rename 'y/a-z/A-Z/' {} \;" \;"

        j'ai ajouté des "" pour bien voir l'imbrication, apres je suis pas sur de la syntaxe non plus :]
        • [^] # Re: une arbo c'est .. .

          Posté par  . Évalué à 1.

          Ya de l'idée :)

          mais

          {~/test} find . -depth -mindepth 1 -type d -exec cd {} && find . -maxdepth 1 -mindepth 1 -type d -exec rename 'y/a-z/A-Z/' {} \; \;
          find: Paramètre manquant pour « -exec »


          et
  • # En plusieurs lignes

    Posté par  . Évalué à 6.


    find x -depth -mindepth 1 -type d | while read p
    do
    d=`dirname "$p"`
    f=`basename "$p" | tr [:lower:] [:upper:]`
    mv "$p" "$d/$f"
    done
    • [^] # Re: En plusieurs lignes

      Posté par  . Évalué à 2.

      Ya juste le titre du message qui est faux : tu peux très bien tout coller en une seule ligne (avec quelques points-virgules) ;o)
      • [^] # Re: En plusieurs lignes

        Posté par  . Évalué à 2.

        Effectivement, mais c'est un peu d'la triche.

        Voila pour le fun :

        $ find . -depth -mindepth 1 -type d | while read p; do d=`dirname "$p"`; f=`basename "$p"| tr a-z A-Z`; mv "$p" "$d/$f"; done
  • # j'ai raté quelque chose ?

    Posté par  (site web personnel) . Évalué à 1.

    root@fox :/home/fox/test#find . -depth -mindepth 1 -type d
    ./test1/test2/test3/test4/test5
    ./test1/test2/test3/test4
    ./test1/test2/test3
    ./test1/test2
    ./test1
    root@fox :/home/fox/test#find . -depth -mindepth 1 -type d | tr a-z A-Z
    ./TEST1/TEST2/TEST3/TEST4/TEST5
    ./TEST1/TEST2/TEST3/TEST4
    ./TEST1/TEST2/TEST3
    ./TEST1/TEST2
    ./TEST1
    root@fox :/home/fox/test#
  • # Et avec sort ?

    Posté par  . Évalué à 2.

    J'y arrive avec un sort inversé, basename et dirname :

     find . -type d | sort -r | while read i ; do j=$(dirname "$i")/$(basename "$i" | tr a-z A-Z); mv "$i" "$j" ; done 


    On pourrait même se passer de « j » mais cela pose problème lorsque les noms des répertoires contiennent des espaces ...
    • [^] # Re: Et avec sort ?

      Posté par  (site web personnel) . Évalué à 1.

      Ca ne fonctionne pas totalement.
      Si j'ai ~/test/test2/test3/test4/test5 et que je fais ca je me retrouve avec ~/test/TEST2/TEST3 et ~/test/TEST2/TEST4 et ~/test/TEST2/TEST5
      • [^] # Re: Et avec sort ?

        Posté par  . Évalué à 2.

        ???

        Comment tu fais ? Le même test fonctionne chez moi.
        Quel shell utilises-tu ? Depuis quel répertoire lances-tu ta commande ?
    • [^] # Re: Et avec sort ?

      Posté par  . Évalué à 3.

      ça marche, mais sans le -mindepth 1, il essaye de faire le rep courant et ça sort des erreurs (chez moi en tout cas)

      donc, juste un $ find . -mindepth 1 -type d | blablabla

      et le sort -r à le même effet que -depth


      -depth Traiter d’abord les sous-répertoires avant le répertoire lui-même.


      donc on garde mon $ find . -depth -mindepth 1 -type d | blablabla et c'est bon

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.