Forum Linux.général classement de fichiers

Posté par .
Tags : aucun
0
15
mar.
2008
Bonjours,

je cherche une commande pour classer mes fichiers mais je ne trouve rien de simple pour le moment.
En gros j'ai pleins de fichiers de type tata01.jpg, tata02.jpg, foo_01.jpg, foo_02.jpg etc qui sont tous dans le même répertoire.
J'aimerai créer un répertoire à chaque fois que j'ai au moins deux fichiers avec la même base. Dans notre cas j'aimerai créer deux répertoire tata et foo qui contiendraient les fichiers tata* et foo* .

Pour le moment je suis bloqué, la seul méthode que j'ai trouvé consiste à écrire un truc du genre :


#!/bin/bash

for line in {a..z}
do
mkdir $line
cd $line
mv $line* $line
for line1 in {a..z}
do
mkdir $line$line1
mv $line$line1* $line$line1
done
cd ..
done


de façon récursive j'obtiens des répertoires aaa aab aac ..... yzz zzz qui contiennent les fichiers par ordre alphabétique.

Le problème arrive lorsque l'on a des mots avec la même racine (anti par exemple) dans ce cas ça ne marche plus.

Quelqu'un aurai une solution ?
  • # gruik

    Posté par . Évalué à 1.


    for X in $(ls -1 | rev | cut -d'.' -f2- | rev | sed -e 's/[0-9]*$//' | uniq -c | grep -v ' 1 ' | cut -c9-)
    do
    mkdir $X
    mv $X*.* $X
    done

    (désolé pour l'absence d'indentation)
    Ca doit coller à l'énoncé
    • [^] # Re: gruik

      Posté par . Évalué à 2.

      Un grand MERCI gruik,

      Ca marche presque parfaitement. J'ai encore un petit problème avec des - et des _ à régler mais je devrai m'en sortir avec un ou deux pipes de plus.
    • [^] # Re: gruik

      Posté par . Évalué à 2.

      Voila c'est fait.
      Au cas ou ça pourrait servir à quelqu'un d'autre voila ma modif :



      for X in $(ls -1 | rev | cut -d'.' -f2- | rev | sed "s/-//g" | sed "s/_//g"| sed -e 's/[0-9]*$//' | uniq -c | grep -v ' 1 ' | cut -c9-)
      do
      mkdir $X
      mv $X*.* $X
      done

      • [^] # Variante

        Posté par . Évalué à 2.

        Moi, je propose :

        ls -1 *[0-9]* | sed -e 's/^\([A-Za-z]*\).*$/\1/g' | sort | uniq -d | while read i ; do mkdir $i; mv $i?* $i ; done
        • [^] # Re: Variante

          Posté par . Évalué à 1.

          En effet c'est pas mal non plus,

          merci à tous les deux, grâce à vous j'aurai appris quelques petits trucs que je ne connaissais pas.
          • [^] # Re: Variante

            Posté par . Évalué à 3.

            Uniquement pour ta culture personnelle, voici quelques petites informations de plus (et en bonus pour les googleurs qui tomberaient içi):

            - l'option -1 pour ls n'est pas nécéssaire car elle est le défaut s'il détecte que sa sortie n'est pas un terminal, mais ça ne fait pas de mal;

            - dans un cadre plus général, tu pourrais avoir des soucis avec un alias sur ls, par exemple avec l'option -F, cela peut s'éviter en mettant explicitement /bin/ls ou avec \ls;

            - parfois, tu peux vouloir faire plusieurs sed consécutifs, mais tu n'a pas envie (ou ne peut pas) de chercher zeu ultimate regexp kivabien... mais tu peux quand même lancer un seul sed par:
            sed -e commande1 -e commande2 ...
            - dans l'expression actuelle du sed, l'option g ne sert à rien, car vu que de toute facon tu match sur une ligne complète (ne serait-ce qu'à cause du ^), ça ne sert à rien de lui spécifier "chercher le pattern plusieurs fois dans la ligne".

            voila, en espérant que ces information t'auront interéssé... bon scripts.
            • [^] # Re: Variante

              Posté par . Évalué à 1.

              Oui en effet, c'est très intéressant tout ça. J'aurai appris plein de truc aujourd'hui.
              C'est vrai que j'ai pas vraiment compris la regexp, il faudrai que je m'y mette sérieusement : c'est quand même super utile.
              Enfin je crois que mes scripts vont être un petit peu moins moche maintenant, ne serai ce que pour les
              mv foo* foo qui deviendront des mv foo?* foo

              bon scripts à vous aussi.
            • [^] # Re: Variante

              Posté par . Évalué à 2.

              ajoutons que pour seulement virer des caractères, tr suffit:
              ... | tr -d '-_' | ...

Suivre le flux des commentaires

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