Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 08/12/2016, à 15:14

totoche09

renommer des repertoires et de fichiers qui sont en plusieurs mots

bonjour smile
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 smile

merci


Modération : merci à l'avenir d'utiliser les balises code (explications ici).

Dernière modification par cqfd93 (Le 08/12/2016, à 18:15)

Hors ligne

#2 Le 08/12/2016, à 15: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, à 15:53)

Hors ligne

#3 Le 08/12/2016, à 22: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 lol

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 sad

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

Hors ligne

#4 Le 08/12/2016, à 23: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 sad

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, à 01:34

totoche09

Re : renommer des repertoires et de fichiers qui sont en plusieurs mots

merci pingouinux cela marche super ou presque tongue

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 hmm

Hors ligne

#6 Le 09/12/2016, à 06: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, à 11: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 sad
si tu pouvais me filer un coup de main pour cela aussi lol

Hors ligne

#8 Le 09/12/2016, à 12: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, à 13: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.

En ligne

#10 Le 09/12/2016, à 14:34

totoche09

Re : renommer des repertoires et de fichiers qui sont en plusieurs mots

merci de vos réponses mais là je suis perdu sad 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