Linux Renommage / tronquage nom de fichiers

Résolu
diego92 Messages postés 14 Date d'inscription   Statut Membre Dernière intervention   -  
diego92 Messages postés 14 Date d'inscription   Statut Membre Dernière intervention   -
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 !
A voir également:

18 réponses

dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
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   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Salut,

Ca ne marche pas aussi ?
rename 's/^(......).*\./$1./' *
0
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
effectivement
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
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
Utilisateur anonyme
 
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   Statut Modérateur Dernière intervention   4 896
 
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
 
salut jipicy

tout à fait, j'étais en train de corriger. :)
0
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
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   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention  
 
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   Statut Modérateur Dernière intervention   4 896
 
Quelle solution qui ne marche et qui te renvoie l'erreur ?
0
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
et avec
for F in ??????_*.* ; do mv $F $(echo $F|sed 's/^\(......\).*\./\1./') ; done 
0
diego92 Messages postés 14 Date d'inscription   Statut Membre Dernière intervention  
 
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
Utilisateur anonyme
 
"ç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   Statut Membre Dernière intervention  
 
@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   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
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 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
$ 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
Utilisateur anonyme
 
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 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
J'ai oublié de vous précisez que j'étais en KSH (AIX)
0
diego92 Messages postés 14 Date d'inscription   Statut Membre Dernière intervention  
 
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
 
hmm, ksh est POSIX, et donc peut parfaitement effectuer les substitutions de paramètre que j'ai évoqué.
0
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
sur AIX, c'est même pas sûr ... en remplaçant $() par '' ça fonctionne avec le plus archaique des sh
0
Utilisateur anonyme
 
AI(e!)X
0
diego92 Messages postés 14 Date d'inscription   Statut Membre Dernière intervention  
 
@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 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
$ ls
ABCDEF_blablablablablablabla.extension    XXXXXX_blablablablablablabla.extension
$ 
$ for F in ??????_*.* ; do mv $F $(echo $F|sed 's/^\(......\).*/\1/') ; done 
$ 
$ ls
ABCDEF    XXXXXX
$
0
Utilisateur anonyme
 
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   Statut Membre Dernière intervention  
 
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
 
lol

sur GNU/Linux : man regex
sur AIX : ?
0
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
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   Statut Membre Dernière intervention  
 
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   Statut Modérateur Dernière intervention   4 896
 
do mv $test  /new_rep/$(echo "$test" | sed 's/\([^_]*\).*/\1/');
0
diego92 Messages postés 14 Date d'inscription   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention  
 
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   Statut Modérateur Dernière intervention   4 896
 
sed 's/55/46/'
0
diego92 Messages postés 14 Date d'inscription   Statut Membre Dernière intervention  
 
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