#1 Le 04/11/2019, à 22:17
- Crestey
Généralisation d'une commande find qui ne marche pas
Bonjour,
Je souhaite renommer en masse des photos
Pour les extensions, j'ai la commande suivante qui change JPG en jpg dans l'arborescence. Ça marche bien:
find -name '*.JPG' -exec bash -c 'mv "{}" "`echo {} | sed "s/.JPG/.jpg/"`" ' \;
J'ai voulu en faire une fonction pour généralisé et passer "JPG" "jpg" en paramètres. (Pour l'appliquer ensuite sur "JPEG" "jpg", "AVI" "avi", etc ...)
Mais ça ne marche pas et je ne comprends pas pourquoi.
#!/bin/bash
# Pour changer JPG en jpg la commande est :
# find -name '*.JPG' -exec bash -c 'mv "{}" "`echo {} | sed "s/.JPG/.jpg/"`" ' \;
# Du coup on en fait une fonction. La fonction renext()
renext()
{
find -name '*.$1' -exec bash -c 'mv "{}" "`echo {} | sed "s/.$1/.$2/"`" ' \;
}
renext "JPG" "jpg"
renext "jpeg" "jpg"
renext "JPEG" "jpg"
renext "AVI" "avi"
renext "MOV" "mov"
renext "MP4" "mp4"
Pourriez-vous m'aider et me dire ce qui bloque SVP ?
Dernière modification par Crestey (Le 04/11/2019, à 22:18)
Merci à tous.
Sous Ubuntu/XFCE depuis 2013. Ça fonctionne vraiment très bien.
Hors ligne
#2 Le 05/11/2019, à 00:03
- Hizoka
Re : Généralisation d'une commande find qui ne marche pas
Salut,
pas très propre ton histoire...
rename -n 's/.JPG$/.jpg/' *.JPG
Si le résultat te convient, tu vires -n.
Et je voulais proposer les commandes suivantes mais ça ne passe pas, il faudra y réfléchir avec les idées claires
function Renommage
{
rename -n "s/.${1^^}$/.${1,,}/" *.${1^^}
}
Renommage jpg
Renommage JpG
Renommage JPG
...
${1^^} : ta variable en majuscule
${1,,} : ta variable en minuscule
et si tu es sûr du format de tes extensions :
function Renommage
{
rename -n "s/.${1}$/.${1}/" *.${1}
}
Renommage JPG jpg
Dernière modification par Hizoka (Le 05/11/2019, à 00:09)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#3 Le 05/11/2019, à 08:33
- Crestey
Re : Généralisation d'une commande find qui ne marche pas
Merci Hisoka,
En fait, j'avais bien vu qu'il existait une fonction rename plus adaptée à cet exercice en particulier.
Mais ma question est plus générale.
Je voudrais comprendre pourquoi mon passage de paramètre ne fonctionne pas avec la commande find, et comment y remédier. (ça m'aidera pour la suite).
Quelle doit être la syntaxe (je suis très débutant en script) ?
Que dois-je mettre autour de mes $1 et $2 pour que ça passe ?
Merci encore
Dernière modification par Crestey (Le 05/11/2019, à 08:35)
Merci à tous.
Sous Ubuntu/XFCE depuis 2013. Ça fonctionne vraiment très bien.
Hors ligne
#4 Le 05/11/2019, à 08:49
- pingouinux
Re : Généralisation d'une commande find qui ne marche pas
Bonjour,
En reprenant des idées en #1 et #2, pour transformer tous les fichiers *.jPg, *.JPG, jPG etc… en *.jpg :
renext()
{
find -iname "*.$1" -exec bash -c 'nom="{}";SUF=${nom##*.};suf=${SUF,,};rename -n "s/$SUF$/$suf/" "$nom"' \;
}
renext "jpg"
Si c'est bon, enlever -n après rename.
Ajouté :
Ou plus simple
renext()
{
shopt -s nocaseglob
for nom in *."$1"
do
suf=${nom##*.}
rename -n "s/.$suf$/$1/" "$nom"
done
}
renext "jpg"
Dernière modification par pingouinux (Le 05/11/2019, à 09:04)
Hors ligne
#5 Le 05/11/2019, à 09:05
- Hizoka
Re : Généralisation d'une commande find qui ne marche pas
renext()
{
while read Fichier
do
mv "${Fichier}" "${Fichier%.*}".${2}
done < <(find -iname "*.${1}")
}
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#6 Le 05/11/2019, à 11:52
- Watael
Re : Généralisation d'une commande find qui ne marche pas
mais... et si le nom d'un fichier comporte un/des espace(s) ?
@Crestey
regarde ça :
var=gabuzomeuh
echo '$var'
echo "$var"
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#7 Le 05/11/2019, à 13:39
- Crestey
Re : Généralisation d'une commande find qui ne marche pas
Merci à vous ! je vais potasser tous ça.
zomeuhmeuhmeuh mercis ! (1000 mercis en shadock )
Merci à tous.
Sous Ubuntu/XFCE depuis 2013. Ça fonctionne vraiment très bien.
Hors ligne