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 20/02/2017, à 00: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... hmm)

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, à 20:56)

Hors ligne

#2 Le 20/02/2017, à 02: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.

En ligne

#3 Le 20/02/2017, à 07: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, à 08:07)

Hors ligne

#4 Le 20/02/2017, à 10: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, à 10: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, à 11: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! smile

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, à 11:26

Kasuus

Re : [Résolu] Suppression sur multiples fichiers avec sed

Watael a écrit :

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....

Anonyme68 a écrit :

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, à 18: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

En ligne

#9 Le 21/02/2017, à 14:57

Kasuus

Re : [Résolu] Suppression sur multiples fichiers avec sed

Hizoka a écrit :

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... hmm

Merci à tous!

Hors ligne

#10 Le 21/02/2017, à 19: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, à 19:44

Kasuus

Re : [Résolu] Suppression sur multiples fichiers avec sed

pingouinux a écrit :

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, à 19:46)

Hors ligne

#12 Le 21/02/2017, à 19: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, à 20:55

Kasuus

Re : [Résolu] Suppression sur multiples fichiers avec sed

pingouinux a écrit :

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, à 21: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

En ligne