Linux Renommage / tronquage nom de fichiers

Résolu/Fermé
diego92 Messages postés 14 Date d'inscription lundi 20 septembre 2010 Statut Membre Dernière intervention 29 septembre 2010 - 20 sept. 2010 à 11:34
diego92 Messages postés 14 Date d'inscription lundi 20 septembre 2010 Statut Membre Dernière intervention 29 septembre 2010 - 29 sept. 2010 à 17:21
Bonjour à tous,

je souhaite écrire un script de renommage de fichiers mais je n'y arrive pas.

Mon problème :

Dans un répertoire se trouve des fichiers de type :

ABCDEF_blablablablablablabla.extension

Comment faire pour les renommer en ne gardant que les 6 premiers caractères ABCDEF + l'extension ? ABCDEF.extensionn

Merci d'avance pour vos lumières !

18 réponses

dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
20 sept. 2010 à 12:23
hello
$ ls
ABCDEF_blablablablablablabla.extension    XXXXXX_blablablablablablabla.extension
$ 
$ rename 's/^(......).*\.(.*)/$1.$2/' *
$ ls
ABCDEF.extension  XXXXXX.extension
$ 
2
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
20 sept. 2010 à 12:46
Salut,

Ca ne marche pas aussi ?
rename 's/^(......).*\./$1./' *
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
20 sept. 2010 à 12:51
effectivement
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
Modifié par lami20j le 20/09/2010 à 12:05
Salut,

$ ls -1 *.extension 
ABCDEF_blablablablabla.extension 
XYZXYZ_blabla blablablablabla.extension 

p049784@FR20083393 ~ $ for f in *.extension;do mv -v "$f" "${f:0:6}.${f/*./}";done 
'ABCDEF_blablablablabla.extension' -> 'ABCDEF.extension' 
'XYZXYZ_blabla blablablablabla.extension' -> 'XYZXYZ.extension'
$ ls -1 *.extension
ABCDEF.extension
XYZXYZ.extension





GNU/Linux:Linux is Not Ubuntu! Quel linux choisir ne veut pas dire votre Distribution préférée,
106485010510997108
1
en bash :
var="ABCDEF_blablablablablablabla.extension"    
echo "${var::6}.${var##*.}" 
#ou 
echo "${var%%_*}.${var##*.}"
Il me semble que c'est POSIX, donc, ça devrait fonctionner avec tous les shells POSIX.
1
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
20 sept. 2010 à 12:15
Salut,

donc, oui ils ont tous un underscore après les 6 première caractères, mais ils peuvent en avoir d'autres derrières ...
Donc "%%" plutôt ;-))

echo "${var%%_*}.${var##*.}"
0
Utilisateur anonyme
20 sept. 2010 à 12:17
salut jipicy

tout à fait, j'étais en train de corriger. :)
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
20 sept. 2010 à 11:54
Salut,

Les noms de fichiers sont tous du type 6 lettres suivies d'1 underscore suivi d'un nombres quelconque de caractères suivis d'1 point et d'1 extension ?

En fait ont-ils tous un underscore ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
diego92 Messages postés 14 Date d'inscription lundi 20 septembre 2010 Statut Membre Dernière intervention 29 septembre 2010
20 sept. 2010 à 12:03
Bonjour, déjà, merci pour l'intérêt que tu portes à mon problème.

Pour te répondre plus précisément :

ABCD9F (6 caractère alpha numérique)
_ (tjs après les 6 première caractères)
blabla : n'importe quel caractère même un underscore !
.extension : tjs la même extension

donc, oui ils ont tous un underscore après les 6 première caractères, mais ils peuvent en avoir d'autres derrières ...

Merci d'avance
0
diego92 Messages postés 14 Date d'inscription lundi 20 septembre 2010 Statut Membre Dernière intervention 29 septembre 2010
20 sept. 2010 à 13:50
Merci à tous pour vos réponses ... par contre cela ne marche pas.

J'ai oublié de vous précisez que j'étais en KSH (AIX)

Et j'ai un message d'erreur suivant :

0403-011 Substitution incorrecte pour cette commande

Du coup, retour à la case départ lol
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
20 sept. 2010 à 13:51
Quelle solution qui ne marche et qui te renvoie l'erreur ?
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
20 sept. 2010 à 13:59
et avec
for F in ??????_*.* ; do mv $F $(echo $F|sed 's/^\(......\).*\./\1./') ; done 
0
diego92 Messages postés 14 Date d'inscription lundi 20 septembre 2010 Statut Membre Dernière intervention 29 septembre 2010
20 sept. 2010 à 14:00
Celles là :

for f in *.extension;do
mv -v "$f" "${f:0:6}.${f/*./}";done

ou

for file in $( ls ./); do
if [[ -f $file && $file = *.* ]]; then
mv $file "${file:0:8}.${file#*.}"
fi
done
0
"ça marche pas" n'est pas très informatif
"mes" expressions POSIX devraient fonctionner, si Ksh/AIX est POSIX (c'est pas dit)

for i in $(command)
est à proscrire ! (imagine qu'il y ait des espaces)

et ce sera plutôt, [[ -f $file ]] && [[ n'importe == quoi ]]
0
diego92 Messages postés 14 Date d'inscription lundi 20 septembre 2010 Statut Membre Dernière intervention 29 septembre 2010
20 sept. 2010 à 14:12
@qqchquicommenceparQ

"for i in $(command) est à proscrire !"

Pourquoi ?

Merci d'avance


@dubcek : Ta commande me fait disparaitre mes fichiers ?? impossible de remettre la main dessus lol
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
20 sept. 2010 à 14:21
Re,

Pourquoi ?
La réponse est entre les paranthèses.(imagine qu'il y ait des espaces)
Si tu ne crois pas, tu peux créer des fichiers avec un espace dans le nom et tu verras.

Quelque soit la solution que tu adopteras il faudra que tu nous montres commen nous l'avons fait (affiche la commande + le résultat) pour comprendre d'où viens ton erreur.
On ne pourra pas t'aider si tous ne nous aide pas.
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
20 sept. 2010 à 14:23
$ ls
ABCDEF_blablablablablablabla.extension    XXXXXX_blablablablablablabla.extension
$ 
$ for F in ??????_*.* ; do mv $F $(echo $F|sed 's/^\(......\).*\./\1./') ; done 
$ ls
ABCDEF.extension  XXXXXX.extension
$ 
0
désolé dubcek

Ha, non!

rename passe encore, même avec des points au lieu d'une expression, mais un sed à la place de bash, ou n'importe quelle substitution de paramètres POSIX, là, je dis non!
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
20 sept. 2010 à 14:51
J'ai oublié de vous précisez que j'étais en KSH (AIX)
0
diego92 Messages postés 14 Date d'inscription lundi 20 septembre 2010 Statut Membre Dernière intervention 29 septembre 2010
20 sept. 2010 à 14:52
La solution de dubcek marche !


Sinon, voilà ce que j'ai avec l'autre solution (mv)

>for f in *.csv;do mv -v "$f" "${f:0:6}.${f/*./}";done
ksh: "${f:0:6}.${f/*./}": 0403-011 Substitution incorrecte pour cette commande.
>
0
Utilisateur anonyme
20 sept. 2010 à 14:53
hmm, ksh est POSIX, et donc peut parfaitement effectuer les substitutions de paramètre que j'ai évoqué.
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
20 sept. 2010 à 14:55
sur AIX, c'est même pas sûr ... en remplaçant $() par '' ça fonctionne avec le plus archaique des sh
0
Utilisateur anonyme
20 sept. 2010 à 15:00
AI(e!)X
0
diego92 Messages postés 14 Date d'inscription lundi 20 septembre 2010 Statut Membre Dernière intervention 29 septembre 2010
20 sept. 2010 à 15:12
@dubcek :

Ta substitution marche très bien ..; par contre je ne la comprend pas (lol, I am a débutant)
Par exemple, j'aimerais enlever l'extension, et ne garder que les 6premières lettres des fichiers ?

@qqchquicommenceparQ : Apparemment le fait que je sois en AIX bloque un peu. Ce n'est pas la première fois que je suis obligé de trouver d'autres méthodes pour de simples scripts ...
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
20 sept. 2010 à 15:18
$ ls
ABCDEF_blablablablablablabla.extension    XXXXXX_blablablablablablabla.extension
$ 
$ for F in ??????_*.* ; do mv $F $(echo $F|sed 's/^\(......\).*/\1/') ; done 
$ 
$ ls
ABCDEF    XXXXXX
$
0
ok, tant qu'à utiliser sed, autant l'utiliser correctement
echo "$F" | sed 's/\([^_]*\).*\(\..*\)/\1\2/
oui,oui, c'est illisible : c'est sed !
0
diego92 Messages postés 14 Date d'inscription lundi 20 septembre 2010 Statut Membre Dernière intervention 29 septembre 2010
20 sept. 2010 à 15:53
Lol, c'est clairement illisible, je n'y comprends rien !

Quelqu'un pourrait m'expliquer, c'est du chinois ? lol

En tout cas ça marche ! Merci à vous pour votre aide !
0
Utilisateur anonyme
20 sept. 2010 à 16:07
lol

sur GNU/Linux : man regex
sur AIX : ?
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
20 sept. 2010 à 16:34
sed 's/^\(......\).*/\1/'
on sauve les 6 premiers caractères dans un champ que l'on restitue à droite avec \1, donc on supprime le reste de la ligne identifié avec .*
0
diego92 Messages postés 14 Date d'inscription lundi 20 septembre 2010 Statut Membre Dernière intervention 29 septembre 2010
20 sept. 2010 à 16:38
Cette solution finale marche parfaitement sous AIX (finalement j'ai viré l'extension)

cd $pathtemp;
for test in *.toto ; 
	do mv $test $(echo "$test" | sed 's/\([^_]*\).*/\1/');
done


J'aimerais déplacer les fichiers transformés, dans un autre répertoire. Y a t'il moyen de rajouter une instruction de déplacement ds la boucle for ?

Merci d'avance
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
20 sept. 2010 à 16:41
do mv $test  /new_rep/$(echo "$test" | sed 's/\([^_]*\).*/\1/');
0
diego92 Messages postés 14 Date d'inscription lundi 20 septembre 2010 Statut Membre Dernière intervention 29 septembre 2010
20 sept. 2010 à 17:22
Merci, c'est good !

Franchement un grand merci à vous tous, je me sens un peu moins bête ce soir ;-)

@++
0
diego92 Messages postés 14 Date d'inscription lundi 20 septembre 2010 Statut Membre Dernière intervention 29 septembre 2010
29 sept. 2010 à 16:45
Re-bonjour,

mon script doit évoluer et mes connaissance de la commande SED sont trop limitées :-(

Je cherche maintenant à modifier mes noms de fichiers de la manière suivante ...

ABCDEF55_blablablablablablabla.extension en
en
ABCDEF46_blablablablablablabla.extension en

Autrement dit j'ai juste un changement des caractère [7-8] à faire et tjs 55->46

Merci d'avance
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
29 sept. 2010 à 16:48
sed 's/55/46/'
0
diego92 Messages postés 14 Date d'inscription lundi 20 septembre 2010 Statut Membre Dernière intervention 29 septembre 2010
29 sept. 2010 à 16:58
Merci !

Par contre je n'avais pas préciser un truc. Je peux rencontrer plusieurs fois le nombre 55 (ds la partie blablabla de mon fichier) mais je ne dois changer que ceux en 7ème et 8ème position !
0