#1 Le 19/02/2017, à 23:14
- Kasuus
[Résolu] Suppression sur multiples fichiers avec sed
Bonsoir à tous,
Voilà je bloque depuis un moment sur un morceau de script.
Je dispose d'un dossier avec plusieurs fichiers de ce type:
[chainedecaractère1]chainedecaractère1
[chainedecaractère1]chainedecaractère3
[chainedecaractère2]chainedecaractère4
[chainedecaractère1]chainedecaractère5
[chainedecaractère2]chainedecaractère6
Je cherche à supprimer les crochets et tout ce qui se trouve entre. Je cherche à utiliser la commande sed pour cela.
La partie ci dessou fonctionne quand je fais un echo $nvnom:
#!/bin/bash
for nom in $(ls);
do
#Supprimer les crochets et ce qu'il y a dedans
nvnom=$( echo -n $nom | sed 's/[[:blank:]]/_/g' | sed 's/\[[^]]*\]//')
echo $nvnom
done
(Bon ne pas tenir compte de sed 's/[[:blank:]]/_/g' . Je cherche à supprimer les espaces mais ça ne marche pas des masses... )
Il me ressort bien le reste de la chaine de caractère sans la première partie avec les crochets.
Mais dès que je fais un un mv par la suite ça par en vrille....
#!/bin/bash
for nom in $(ls);
do
#Supprimer les crochets et ce qu'il y a dedans
nvnom=$( echo -n $nom | sed 's/[[:blank:]]/_/g' | sed 's/\[[^]]*\]//')
mv $nom $nvnom
done
mv: impossible d'évaluer '[chainedecaractère1]': Aucun fichier ou dossier de ce type
Je dois faire une erreur mais j'ai eu beau essayer plein de chose mais rien à faire...
Quelqu'un à une idée?
Dernière modification par Kasuus (Le 21/02/2017, à 19:56)
Hors ligne
#2 Le 20/02/2017, à 01:45
- Watael
Re : [Résolu] Suppression sur multiples fichiers avec sed
salut,
c'est pour ça qu'on utilise pas de substitution de commande avec for : ça boucle sur des mots, pas des lignes !
mais, bon, t'énerve pas à faire une boucle avec des sed, utilise rename.
comme son nom l'indique, ça sert renommer des fichiers, en utilisant des regex perl.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#3 Le 20/02/2017, à 06:56
- MicP
Re : [Résolu] Suppression sur multiples fichiers avec sed
J'avais pensé à une boucle avec du bash :
for fich in *;do mv "${fich}" "${fich/*]/}";done
=======
Il y a aussi comme ça, histoire de ne tenir compte que des
noms des fichiers dont le premier caractère est un [ :
for fich in [*;do mv "${fich}" "${fich/*]/}";done
Dernière modification par MicP (Le 20/02/2017, à 07:07)
Hors ligne
#4 Le 20/02/2017, à 09:14
- Compte anonymisé
Re : [Résolu] Suppression sur multiples fichiers avec sed
la remarque de Watael est pertinente, rename est l'équivalent de sed pour renommer les fichiers.
un truc comme ça devrait faire l'affaire (enlever le -n pour que le renommage s'effectue) :
rename -n 's/\[.*\]//' *
ou bien en conservant ta syntaxe :
rename -n 's/\[[^]]*\]//' *
#5 Le 20/02/2017, à 09:28
- MicP
Re : [Résolu] Suppression sur multiples fichiers avec sed
Je cours me cacher moi qui connait si mal rename
Hors ligne
#6 Le 20/02/2017, à 10:16
- Kasuus
Re : [Résolu] Suppression sur multiples fichiers avec sed
Merci à tous!
En effet rename fonctionne parfaitement et fait exactement ce que je lui demande.
Fantastique!
Alors une question pour comprendre :
J'ai testé la fonction mv comme ci dessous:
for nom in *;
do
#Supprimer les crochets et ce qu'il y a dedans
mv "${nom}" "${nom/*]/}";
# rename 's/\[[^]]*\]//' *
done
Mais lorsque je remplace for nom in *; par for nom in $(ls); cela ne fonctionne plus.
Tandis qu'avec rename cela fonctionne.
Quelqu'un peut il m'éclairer?
Hors ligne
#7 Le 20/02/2017, à 10:26
- Kasuus
Re : [Résolu] Suppression sur multiples fichiers avec sed
c'est pour ça qu'on utilise pas de substitution de commande avec for : ça boucle sur des mots, pas des lignes !
Merci pour l'explication, ça explique pas mal des retours d'erreurs que j'avais....
la remarque de Watael est pertinente, rename est l'équivalent de sed pour renommer les fichiers.
Donc on évite d'utiliser sed pour un renommage, mais rename comme vous le préconisez aussi
Hors ligne
#8 Le 20/02/2017, à 17:32
- Hizoka
Re : [Résolu] Suppression sur multiples fichiers avec sed
Salut, juste pour info annexe :
echo -n $nom | sed 's/[[:blank:]]/_/g'
sed 's/[[:blank:]]/_/g' <<< "${nom}"
sed 's/[[:blank:]]/_/g' | sed 's/\[[^]]*\]//'
sed 's/[[:blank:]]/_/g ; s/\[[^]]*\]//'
echo -n $nom | sed 's/[[:blank:]]/_/g' | sed 's/\[[^]]*\]//'
sed 's/[[:blank:]]/_/g ; s/\[[^]]*\]//' <<< "${nom}"
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#9 Le 21/02/2017, à 13:57
- Kasuus
Re : [Résolu] Suppression sur multiples fichiers avec sed
Salut, juste pour info annexe :
echo -n $nom | sed 's/[[:blank:]]/_/g' sed 's/[[:blank:]]/_/g' <<< "${nom}" sed 's/[[:blank:]]/_/g' | sed 's/\[[^]]*\]//' sed 's/[[:blank:]]/_/g ; s/\[[^]]*\]//' echo -n $nom | sed 's/[[:blank:]]/_/g' | sed 's/\[[^]]*\]//' sed 's/[[:blank:]]/_/g ; s/\[[^]]*\]//' <<< "${nom}"
Merci Hizoka
Je suis toujours preneur d'un peu d'optimisation comme ça.
=======================================================================================================
Je pose une dernière question avant de poser en résolu (Des fois que quelqu'un repasse par là...)
J'ai le cas suivant:
[chainedecaractère1]chainedecaractère1.X02.chainedecaractère.jpg
[chainedecaractère1]chainedecaractère3.X07.chainedecaractère.jpg
[chainedecaractère2]chainedecaractère4.X00.chainedecaractère.jpg
[chainedecaractère1]chainedecaractère5.X01.chainedecaractère.jpg
[chainedecaractère2]chainedecaractère6.X03.chainedecaractère.jpg
Je cherche, par la suite, à supprimer dans cette même chaine la fin de la chaine. Mais après l'élément X[0-9] pour cela j'ai fait le code suivant
for i in *.jpg ;
do
mv "$i" "${i/X[0-9.]*.jpg/.jpg}" ;
done
Hors je comprends mon erreur. Il me garde le début de ma chaine de caractère mais en supprimant tout ce qu'il y a depuis X[0-9]. Hors je ne trouve pas la commande pour lui signifier après celle ci.:mad:
J'ai pensé à stipuler ce qu'il y a après mais hélas c'est une chaine de caractère trop variable...
Merci à tous!
Hors ligne
#10 Le 21/02/2017, à 18:22
- pingouinux
Re : [Résolu] Suppression sur multiples fichiers avec sed
Bonjour,
Peux-tu donner un exemple de ce que tu veux obtenir.
Hors ligne
#11 Le 21/02/2017, à 18:44
- Kasuus
Re : [Résolu] Suppression sur multiples fichiers avec sed
Bonjour,
Peux-tu donner un exemple de ce que tu veux obtenir.
Oui en effet ça aide....
Que [chainedecaractère1]chainedecaractère1.X02.chainedecaractère.jpg devienne [chainedecaractère1]chainedecaractère1.X02.jpg
En clair ça supprime ce qui est après X[0-9] en gardant le .jpg
Mon script supprime tout comme je lui demande mais en prenant le X[0-9]. L'idée est de garder cela.
Dernière modification par Kasuus (Le 21/02/2017, à 18:46)
Hors ligne
#12 Le 21/02/2017, à 18:53
- pingouinux
Re : [Résolu] Suppression sur multiples fichiers avec sed
Essaye ceci :
for i in *.jpg ;
do
mv "$i" "$(sed -r 's/(X[0-9]+\.).*\./\1/' <<<"$i")" ;
done
Hors ligne
#13 Le 21/02/2017, à 19:55
- Kasuus
Re : [Résolu] Suppression sur multiples fichiers avec sed
Essaye ceci :
for i in *.jpg ; do mv "$i" "$(sed -r 's/(X[0-9]+\.).*\./\1/' <<<"$i")" ; done
Merci ça fonctionne nickel!
Je me permet d'abuser.... Je comprends
mv "$i" "$(sed -r 's/(X[0-9]+\.).*
Mais pour la partie d'après je suis un peu largué... A quoi correspond \1/ et surtout <<<"$i" ?
Merci en tout cas!
Hors ligne
#14 Le 21/02/2017, à 20:00
- Hizoka
Re : [Résolu] Suppression sur multiples fichiers avec sed
le \1 est le contenu des ()
<<<"$i" lui indique le texte sur lequel travailler
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne