Linux Renommage / tronquage nom de fichiers
Résoludiego92 Messages postés 14 Statut Membre -
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
Renommer des fichiers pour ne conserver que les six premiers caractères et l’extension présente une problématique fréquente dans les scripts à automatiser transformer ABCDEF_blablablablablablabla.extension en ABCDEF.extension. Plusieurs solutions reposent sur des outils courants, notamment une expression régulière avec rename, un script shell avec for et mv, ou des expansions de paramètres Bash pour extraire le préfixe et l’extension. Des variantes POSIX et Bash existent, par exemple ${f:0:6}.${f##*.} ou ${f%%_*}.${f##*.}, et certains répondants signalent des limites selon le shell, notamment sur AIX ou lorsque les noms contiennent des espaces. En dernier élément utile, déplacer les fichiers renommés dans un autre répertoire via une boucle peut nécessiter d’adapter la commande selon l’emplacement et le shell utilisé.
-
hello
$ ls ABCDEF_blablablablablablabla.extension XXXXXX_blablablablablablabla.extension $ $ rename 's/^(......).*\.(.*)/$1.$2/' * $ ls ABCDEF.extension XXXXXX.extension $
-
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 -
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. -
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 ? -
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
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 -
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 -
et avec
for F in ??????_*.* ; do mv $F $(echo $F|sed 's/^\(......\).*\./\1./') ; done
-
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 -
"ç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 ]] -
@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-
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. -
-
-
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! -
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.
> -
hmm, ksh est POSIX, et donc peut parfaitement effectuer les substitutions de paramètre que j'ai évoqué.
-
-
-
@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 ... -
-
-
ok, tant qu'à utiliser sed, autant l'utiliser correctement
echo "$F" | sed 's/\([^_]*\).*\(\..*\)/\1\2/
oui,oui, c'est illisible : c'est sed ! -
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 ! -
-
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 .* -
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-
-
-
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 -
-
-