Retourner aux forums || Retourner au forum Linux.general

Linux.general : classement de fichiers

Posté par nanodots () le 15 mars 2008
0
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 ?

> Lire le message (10 commentaires, moyenne: 1,8).  

Cette discussion est archivée, il n'est plus possible de laisser des commentaires.

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

gruik

Posté par syntaxerror () le 15/03/2008 à 16:47. (lien). É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 nanodots () le 15/03/2008 à 17:11. (lien). É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 nanodots () le 15/03/2008 à 17:23. (lien). É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 Obsidian () le 15/03/2008 à 19:57. (lien). É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 nanodots () le 15/03/2008 à 23:05. (lien). É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 Christophe --- () le 16/03/2008 à 01:17. (lien). É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 nanodots () le 16/03/2008 à 01:52. (lien). É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 Grégoire G (Jabber id, page perso, ) le 17/03/2008 à 02:51. (lien). Évalué à 2.

              Il existe un paquet :

              kregexpeditor

              C'est sympa et pratique.

              • [^]Re: Variante

                Posté par carlo () le 17/03/2008 à 09:57. (lien). Évalué à 2.

                et Kodos également.

                --
                carl0:
          • [^]Re: Variante

            Posté par syntaxerror () le 17/03/2008 à 12:13. (lien). Évalué à 2.

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

Revenir en haut de page || Retourner aux forums || Retourner au forum Linux.general