[bash] - renommer - ajouter de façon récursif

Résolu/Fermé
enyrix Messages postés 144 Date d'inscription vendredi 11 novembre 2011 Statut Membre Dernière intervention 7 avril 2021 - 5 juil. 2012 à 21:09
enyrix Messages postés 144 Date d'inscription vendredi 11 novembre 2011 Statut Membre Dernière intervention 7 avril 2021 - 10 juil. 2012 à 02:43
Bonjour,
J'ai une fonction pour renommer en majuscule les fichier jpg en minuscule..
J'aimerais que cette commande fonctionne de façon récursif pour le dossier en cours et les sous dossiers, mais je sais pas trop comment m'y prendre.. Je demande votre aide... Merci.

for i in *.jpg; do ext=${i##*.}; name=$(basename "$i" ".$ext" | tr '[a-z]' '[A-Z]').$ext; mv $i $name; done
A voir également:

7 réponses

jisisv Messages postés 3645 Date d'inscription dimanche 18 mars 2001 Statut Modérateur Dernière intervention 15 janvier 2017 934
Modifié par jisisv le 5/07/2012 à 22:55
Je viens de mettre de l'ordre dans mon répertoire de photos afin de n'avoir que des noms de fichiers propres (sans espaces, extensions minuscules...)

Si ta question est scolaire on pourra en reparler.

Si ta question est purement pratique, et que tu utilises une distribution digne de ce nom (Debian..), tu peux utiliser rename dans un filtre:
find . -iname '*JPG' -print0 | xargs --null rename 's!jpg$!JPG!i'

man find; man xargs; man rename
rename est fourni avec PERL sous Debian wheezy.
Un CONSEIL: fait l'inverse; sous Unix les noms de fichiers utilisateurs ont une extension en minuscules.
Le problème vient de certains systèmes propriétaires incohérents qui ne gèrent pas du tout la casse.

Gates gave ^H sold you the windows.
GNU gave us the whole house.(Alexandrin)
1
enyrix Messages postés 144 Date d'inscription vendredi 11 novembre 2011 Statut Membre Dernière intervention 7 avril 2021 8
Modifié par enyrix le 5/07/2012 à 23:14
Merci. Ma question est purement pratique. En fait ce n'est pas l'extension que je veux renommer mais seulement le nom du fichier avant l'extension et ce de façon récursif (ce que semble faire la commande find par default)

C'est vraiment de minuscule à majuscule volontairement, c'est pour un besoin particulier même si c'est pas la norme!

En passant, moi c'est pour Ubuntu Server mais ça marche quand même ta commande, je l'ai testé. Ça reste générique!

Il y aurait moyen de modifier ta commande pour cibler que le nom du fichier, mais toujours en ciblant les fichier avec l'extension jpg ?
0
jisisv Messages postés 3645 Date d'inscription dimanche 18 mars 2001 Statut Modérateur Dernière intervention 15 janvier 2017 934
5 juil. 2012 à 23:39
Utilise un motif dans find
johand@osiris: ~/tmp/sandbox $ touch p001.jPg p002.JpG brol.jpg q001.jpg
johand@osiris: ~/tmp/sandbox $ find . -iname '[pq]*JPG' -print0 | xargs --null rename 's!jpg$!JPG!i'
johand@osiris: ~/tmp/sandbox $ ll
total 0
-rw-r--r-- 1 johand johand 0 jui  5 23:36 brol.jpg
-rw-r--r-- 1 johand johand 0 jui  5 23:36 p001.JPG
-rw-r--r-- 1 johand johand 0 jui  5 23:36 p002.JPG
-rw-r--r-- 1 johand johand 0 jui  5 23:36 q001.JPG
0
enyrix Messages postés 144 Date d'inscription vendredi 11 novembre 2011 Statut Membre Dernière intervention 7 avril 2021 8
6 juil. 2012 à 00:01
Ce n'est pas l'extention .jpg que je veux convertir mais bien le nom du fichier (ce qui précède .jpg)
exemple:

12bf0.jpg 12bf5.JPG 12c01.jpg 12a27.jpg ABFE.jpg AC05.jpg AC09.jpg BB56.JPG
doit donner:
12BF0.jpg 12BF5.jpg 12C01.jpg 12A27.jpg ABFE.jpg AC05.jpg AC09.jpg BB56.jpg
0
enyrix Messages postés 144 Date d'inscription vendredi 11 novembre 2011 Statut Membre Dernière intervention 7 avril 2021 8
9 juil. 2012 à 06:53
Mon problème n'est toujours pas résolue qqn pourrait m'aider ?
0
dubcek Messages postés 18753 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 7 novembre 2024 5 619
9 juil. 2012 à 16:39
hello
change la casse uniquement dans le nom du fichier, enlever le -n pour effectuer. a tester avant.
$ rename -n  's+(^.*/)([^\.]*)(\.)+$1\U$2$3+' {} \; $(find . -iname "*.jpg")
./12c01.jpg renamed as ./12C01.jpg
./12bf5.JPG renamed as ./12BF5.JPG
./12bf0.jpg renamed as ./12BF0.jpg
./a/12c01.jpg renamed as ./a/12C01.jpg
./a/12bf5.JPG renamed as ./a/12BF5.JPG
./a/12bf0.jpg renamed as ./a/12BF0.jpg
./a/a/12c01.jpg renamed as ./a/a/12C01.jpg
./a/a/12bf5.JPG renamed as ./a/a/12BF5.JPG
./a/a/12bf0.jpg renamed as ./a/a/12BF0.jpg
./a/a/12a27.jpg renamed as ./a/a/12A27.jpg
./a/12a27.jpg renamed as ./a/12A27.jpg
./12a27.jpg renamed as ./12A27.jpg
$ 
1
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
9 juil. 2012 à 08:40
https://www.linuxquestions.org/questions/linux-software-2/change-case-of-a-string-toupper-in-shell-script-319736/
tr "[:upper:]" "[:lower:]" 

comme tr fait des opérations sur les fichiers, il faut ruser.
for file in $(ls *.jpg *.JPG)
do :
   mv $file $(echo $file |tr "[:upper:]" "[:lower:]")
done
0
enyrix Messages postés 144 Date d'inscription vendredi 11 novembre 2011 Statut Membre Dernière intervention 7 avril 2021 8
Modifié par enyrix le 9/07/2012 à 09:01
J,ai essayer de combiner la commande à ce que j'ai présentement...
Je voudrais renommer mes fichiers en majuscule mais en gardant l'extension en minuscule. C'est possible de combiner cela en une commande et de lexécuter?
J'aimerais utliser la commande mv pour pouvoir garder écraser au besoin ce que semble pas faire rename..

Partie 1
find . -type f -name "*.jpg" |  grep -v '.svn' | tr "[:lower:]" "[:upper:]"  

Partie 2
find . -type f -name "*.jpg" |  grep -v '.svn' | tr "[:lower:]" "[:upper:]" | sed 's/.*\.//' | tr "[:upper:]" "[:lower:]" 
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 417
9 juil. 2012 à 09:57
Salut,

$ ls -1
12a27.jpg
12bf0.jpg
12bf5.JPG
12c01.jpg
ABFE.jpg
AC05.jpg
AC09.jpg
BB56.JPG

$ ls -1 | sed 's/\([^.]*.\)\(.*\)/\U\1\L\2/'
12A27.jpg
12BF0.jpg
12BF5.jpg
12C01.jpg
ABFE.jpg
AC05.jpg
AC09.jpg
BB56.jpg

$ 
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
9 juil. 2012 à 10:00
Je n'ai pas tout compris...
Le plus simple est de faire ce que je t'ai donné en premier, puis de faire l'inverse de ce que fait jisisv pour mettre les extensions en minuscule. Si tu veux vraiment le faire en une commande, il faut passer par basename, ou alors utiliser exec de find.
0
enyrix Messages postés 144 Date d'inscription vendredi 11 novembre 2011 Statut Membre Dernière intervention 7 avril 2021 8
9 juil. 2012 à 10:05
Étrange ça fais 4 fois que je commit un commentaire et que le site ne l'enregistre pas! Je m'essaie à nouveau !

Moi je voudrais pouvoir le faire sur tous les fichiers avec sous-dossiers inclus...
0
enyrix Messages postés 144 Date d'inscription vendredi 11 novembre 2011 Statut Membre Dernière intervention 7 avril 2021 8
9 juil. 2012 à 10:11
Merci de votre support! Le viens de voir vos message, après un bug d'affichage et d'enregistrement sur le forum !

c'est exactement cela :
ls -1 | sed 's/\([^.]*.\)\(.*\)/\U\1\L\2/'

mais en incluant tous les fichiers dans tous les sous dossiers aussi (et ne pas renommer les dossiers et sous-dossiers, renommer que les fichiers)

Et aussi comment rendre cette comande exécutable ?

Ça me derange pas de devoir faire plusieurs lignes de commandes... pour arriver à mon résultat! C'est ce qui compte!
0
enyrix Messages postés 144 Date d'inscription vendredi 11 novembre 2011 Statut Membre Dernière intervention 7 avril 2021 8
9 juil. 2012 à 09:55
Étrange ça fais 3 fois que je commit un commentaire et que le site ne l'enregistre pas!

J'ai progressé dans mon code.. Présentement le problème c'est que ça tente de renommer aussi les dossiers même si j'ai mis l'argument -type f ... moi j'e veux renommer seulement les fichiers et ne pas toucher noms de dossiers et de sous-dossiers..

Efface tous les fichier et dossier .svn
find . -name .svn -print0 | xargs -0 rm -rf

Change tous les fichiers en majuscules
for i in 'find . -type f'; do new_name='echo $i | tr '[a-z]' '[A-Z]''; mv $i $new_name ; done

change uniquement tous les extensions de fichiers .JPG en minuscule (.jpg)
find . -iname '*JPG' -print0 | xargs --null rename 's!JPG$!jpg!i'
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 417
9 juil. 2012 à 10:21
$ ls
11n_Setup.exe  pilote_ralink_AWUS051NH.exe  rep/

$ ls -1 rep/
12a27.jpg
12bf0.jpg
12bf5.JPG
12c01.jpg
ABFE.jpg
AC05.jpg
AC09.jpg
BB56.JPG

$ find . -type f -iname '*jpg' -exec bash -c \
'rep=$(dirname $1);name=$(basename $1);pref=${name%%.*};suff=${name##*.};
mv -v ${1} ${rep}/${pref^^}.${suff,,}' _ {} \;

« ./rep/BB56.JPG » -> « ./rep/BB56.jpg »
mv: « ./rep/AC09.jpg » et « ./rep/AC09.jpg » identifient le même fichier
mv: « ./rep/AC05.jpg » et « ./rep/AC05.jpg » identifient le même fichier
mv: « ./rep/ABFE.jpg » et « ./rep/ABFE.jpg » identifient le même fichier
« ./rep/12a27.jpg » -> « ./rep/12A27.jpg »
« ./rep/12c01.jpg » -> « ./rep/12C01.jpg »
« ./rep/12bf5.JPG » -> « ./rep/12BF5.jpg »
« ./rep/12bf0.jpg » -> « ./rep/12BF0.jpg »

$ ls -1 rep/
12A27.jpg
12BF0.jpg
12BF5.jpg
12C01.jpg
ABFE.jpg
AC05.jpg
AC09.jpg
BB56.jpg

$ 
0
enyrix Messages postés 144 Date d'inscription vendredi 11 novembre 2011 Statut Membre Dernière intervention 7 avril 2021 8
9 juil. 2012 à 22:36
Merci pour votre aide, malheureusement il semble qu'il y a eu un bug quand j'ai écrits des messages à plusieurs reprises mais qui disparaissait quand je rechargeait cette page. De plus, il y a eu un délais avant que je vois vos messages.. je répondais alors que vos messages était déjà là alors que je ne les voyais pas... étrange !

Je retente d'écrire cette fois... (je vais copier mon message au cas où!!!)
Je crois avoir trouvé ma solution avec ce que vous m'avez donné.. La voici:

Efface tous les fichier et dossier .svn
find . -name .svn -print0 | xargs -0 rm -rf

Renomme tous les noms fichiers dans tous les dossiers et sous dossier avec extension .jpg ou .JPG en majuscule exemple: test.jpg -> TEST.JPG, test.JPG -> TEST.JPG
& Ne renomme pas les dossiers et sous-dossiers
rename 's+(^.*/)([^\.]*)(\.)+$1\U$2$3+' {} \; $(find . -iname "*.jpg")

change uniquement tous les extensions de fichiers .JPG en minuscule (.jpg)
find . -iname '*JPG' -print0 | xargs --null rename 's!JPG$!jpg!i'


Forcer le commit de tous les fichiers dans un nouveau svn propre
svn --force --depth infinity add .
svn commit


Je vais tester sur mon gros répertoire et si ça marche je mettrais cette discussion à résolue!
0
enyrix Messages postés 144 Date d'inscription vendredi 11 novembre 2011 Statut Membre Dernière intervention 7 avril 2021 8
9 juil. 2012 à 23:01
TEST4 (envoie de ce commentaire mais sans le code)
Merci pour votre aide, malheureusement il semble qu'il y a eu un bug quand j'ai écrits des messages à plusieurs reprises mais qui disparaissait quand je rechargeait cette page. De plus, il y a eu un délais avant que je vois vos messages.. je répondais alors que vos messages était déjà là alors que je ne les voyais pas... étrange !

Je retente d'écrire cette fois... (je vais copier mon message au cas où!!!)
Je crois avoir trouvé ma solution avec ce que vous m'avez donné..

J'essaie d'écrire le code ici mais mon message est marqué comme envoyé mais ne s'affiche pas si je réactualise...
J'aurais bien voulu vous donner la solutions...

Je vais tester sur mon gros répertoire et si ça marche je mettrais cette discussion à résolue!
0
enyrix Messages postés 144 Date d'inscription vendredi 11 novembre 2011 Statut Membre Dernière intervention 7 avril 2021 8
9 juil. 2012 à 23:04
Voici mon code que le forum veut pas prendre alors je l'ai copié sur le site:
https://pastebin.com/Z6tVLKYr
0
enyrix Messages postés 144 Date d'inscription vendredi 11 novembre 2011 Statut Membre Dernière intervention 7 avril 2021 8
10 juil. 2012 à 02:43
Merci à tous (jisisv, zipe31, dubcek, Char Snipeur) de m'avoir aidé même si c'étais pas trop évident! Affaire résolue!
0