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 syntaxerror . É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 . Évalué à 2.
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 . Évalué à 2.
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 . Évalué à 2.
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 . Évalué à 1.
merci à tous les deux, grâce à vous j'aurai appris quelques petits trucs que je ne connaissais pas.
[^] # Re: Variante
Posté par Christophe --- . Évalué à 3.
- 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 . Évalué à 1.
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 GG (site web personnel) . Évalué à 2.
kregexpeditor
C'est sympa et pratique.
Pourquoi bloquer la publicité et les traqueurs : https://greboca.com/Pourquoi-bloquer-la-publicite-et-les-traqueurs.html
[^] # Re: Variante
Posté par carlo . Évalué à 2.
[^] # Re: Variante
Posté par syntaxerror . Évalué à 2.
... | tr -d '-_' | ...
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.