#1 Le 08/12/2016, à 14:14
- totoche09
renommer des repertoires et de fichiers qui sont en plusieurs mots
bonjour
j' apprend le bash et je me suis fait un petit programme bash pour compresser des photos
!/bin/bash
for rep in "$(find . -type d | ls)"; do
cd "$rep"
for Photo_ect in "$(find . -type d | ls)"; do
cd "$Photo_ect"
for photo in "$(find . -type f | ls -r)"; do
convert "$photo" -quality 75 "$photo"
done
cd ..
done
cd ..
done
celui-ci marche très bien sauf quand le nom des répertoires ou des photos sont composés de plusieurs mots espacés
en cherchant sur le net j'ai trouvé ceci:
pour les dossiers:
find /home -type d -exec rename 's/ /_/g' {} \;
pour les fichiers
find /home -type f -exec rename 's/ /_/g' {} \;
j'ai eu beau tourner dans tous les sens cela ne marche pas, si quelqu'un pouvait m'aider cela serait sympa
merci
Modération : merci à l'avenir d'utiliser les balises code (explications ici).
Dernière modification par cqfd93 (Le 08/12/2016, à 17:15)
Hors ligne
#2 Le 08/12/2016, à 14:34
- pingouinux
Re : renommer des repertoires et de fichiers qui sont en plusieurs mots
Bonjour,
Quelle usine à gaz !
Pour voir ce que fait ton script, place un echo devant le convert.
Pour traiter tous les fichiers .jpg situés dans l'arborescence du répertoire courant, je ferais ceci :
find . -type f -name \*.jpg -exec mogrify -quality 75 {} \;
Ajouté :
Et pour remplacer les espaces par des _ dans tous les noms des fichier et répertoires de l'arborescence (il faut commencer par le bas, d'où le -depth) :
find répertoire_de_départ -depth -execdir echo rename 's/ /_/g' {} \;
Commande hasardeuse, que je te déconseille de lancer dans tout le /home
Enlever le echo si ça te convient.
Dernière modification par pingouinux (Le 08/12/2016, à 14:53)
Hors ligne
#3 Le 08/12/2016, à 21:30
- totoche09
Re : renommer des repertoires et de fichiers qui sont en plusieurs mots
merci de me répondre aussi vite pingouinux
c'est une usine à gaz mais j' apprend
find . -type f -name \*.jpg -exec mogrify -quality 75 {} \;
marche très bien en ligne de commande mais je n'arrive pas à l'intégrer dans mon programme
find répertoire_de_départ -depth -execdir echo rename 's/ /_/g' {} \;
en ligne de commande
rename s/ /_/g ./toto a la plage 12.jpg
rename s/ /_/g ./toto - 2016-01-17 - a la plage
ce qui me parait bizarre
Hors ligne
#4 Le 08/12/2016, à 22:58
- pingouinux
Re : renommer des repertoires et de fichiers qui sont en plusieurs mots
pingouinux a écrit :find . -type f -name \*.jpg -exec mogrify -quality 75 {} \;
marche très bien en ligne de commande mais je n'arrive pas à l'intégrer dans mon programme
Cette ligne est censée remplacer ton programme.
pingouinux a écrit :find répertoire_de_départ -depth -execdir echo rename 's/ /_/g' {} \;
en ligne de commande
rename s/ /_/g ./toto a la plage 12.jpg rename s/ /_/g ./toto - 2016-01-17 - a la plage
ce qui me parait bizarre
Si c'est le résultat du echo que tu montres, c'est normal. Si la liste des fichiers correspond à ceux que tu veux renommer, il suffit d'enlever le echo.
Hors ligne
#5 Le 09/12/2016, à 00:34
- totoche09
Re : renommer des repertoires et de fichiers qui sont en plusieurs mots
merci pingouinux cela marche super ou presque
mon programme se fait par ordre alphabétique car si une image est mal enregistrée cela me permet de la retrouver facilement alors que là cela part dans tous les sens.
j'ai aussi essayé de mettre -print car j'aime bien voir si un programme tourne
find Abb -depth -execdir rename 's/_/ /g' -print {} \;
j' obtient un résultat en ligne ce qui est illisible
et pour
find . -name \*.jpg -exec mogrify -quality 95 -print {} \;
celà ne donne rien du tout
Hors ligne
#6 Le 09/12/2016, à 05:58
- pingouinux
Re : renommer des repertoires et de fichiers qui sont en plusieurs mots
Pour utiliser l'option -print de find, il faut faire ceci
find répertoire_de_départ -print -depth -execdir rename 's/ /_/g' {} \;
mais tu peux utiliser l'option -v de rename, qui montre ce que fait la commande
find répertoire_de_départ -depth -execdir rename -v 's/ /_/g' {} \;
ou l'option -n de rename pour voir ce que ferait la commande, mais sans l'exécuter (mieux que le echo que je t'ai indiqué en #2)
find répertoire_de_départ -depth -execdir rename -n 's/ /_/g' {} \;
Hors ligne
#7 Le 09/12/2016, à 10:01
- totoche09
Re : renommer des repertoires et de fichiers qui sont en plusieurs mots
merci, j' ai opté pour
find répertoire_de_départ -depth -execdir rename -v 's/ /_/g' {} \;
excuse si je met du temps pour répondre car j'ai fait des recherche sur le forum pour mettre un | sort sur les 2 lignes du programme pour les trier par ordre alphabétique mais je n'ai rien trouvé qui fonctionne
si tu pouvais me filer un coup de main pour cela aussi
Hors ligne
#8 Le 09/12/2016, à 11:24
- pingouinux
Re : renommer des repertoires et de fichiers qui sont en plusieurs mots
Si tu veux lister les fichiers .png de l'arborescence par ordre alphabétique
shopt -s globstar dotglob
ls -1 **/*.png
Hors ligne
#9 Le 09/12/2016, à 12:43
- Watael
Re : renommer des repertoires et de fichiers qui sont en plusieurs mots
euh, pourquoi dotglob ?
et, pourquoi ls ?
shopt -s globstar nullglob
printf '%s\n' **/*.png
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#10 Le 09/12/2016, à 13:34
- totoche09
Re : renommer des repertoires et de fichiers qui sont en plusieurs mots
merci de vos réponses mais là je suis perdu comment faire pour mettre vos 2 lignes de programme dans :
find répertoire_de_départ -depth -execdir rename -v 's/ /_/g' {} \;
et dans:
find -name \*.jpg -exec mogrify -quality 75 {} \;
Hors ligne