Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 22/02/2007, 20h30   #1
Membre Expert
 
Avatar de gifffftane
 
Inscription : février 2007
Messages : 2 354
Détails du profil
Informations personnelles :
Localisation : France, Loire (Rhône Alpes)

Informations forums :
Inscription : février 2007
Messages : 2 354
Points : 2 034
Points : 2 034
Par défaut Changer l'encodage de pleins de fichiers

Bonjour,

J'ai plein de fichiers en UTF-8859-1, et je voudrais tous les passer en UTF8 avec une commande.

Est-ce que cela existe ?
gifffftane est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2007, 20h36   #2
Expert Confirmé
 
Homme
Inscription : septembre 2006
Messages : 2 292
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : septembre 2006
Messages : 2 292
Points : 2 740
Points : 2 740
Citation:
Envoyé par gifffftane
Bonjour,

J'ai plein de fichiers en UTF-8859-1, et je voudrais tous les passer en UTF8 avec une commande.

Est-ce que cela existe ?
man iconv

iconv -f ISO-8859-1 -t UTF-8 filename.in > filename.out
JeitEmgie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2007, 21h31   #3
Membre Expert
 
Avatar de gifffftane
 
Inscription : février 2007
Messages : 2 354
Détails du profil
Informations personnelles :
Localisation : France, Loire (Rhône Alpes)

Informations forums :
Inscription : février 2007
Messages : 2 354
Points : 2 034
Points : 2 034
Déjà, iconv, c'est bien, merci.

Mais... et si je veux changer de nombreux fichiers répartis dans un répertoire et ses sous-répertoires ? D'après le man, je ne peux modifier les fichiers que un par un, et je dois tous les renommer
gifffftane est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2007, 23h04   #4
Expert Confirmé
 
Homme
Inscription : septembre 2006
Messages : 2 292
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : septembre 2006
Messages : 2 292
Points : 2 740
Points : 2 740
Citation:
Envoyé par gifffftane
Déjà, iconv, c'est bien, merci.

Mais... et si je veux changer de nombreux fichiers répartis dans un répertoire et ses sous-répertoires ? D'après le man, je ne peux modifier les fichiers que un par un, et je dois tous les renommer
ça n'a rien à voir avec iconv…
c'est un problème classique de traitement de fichiers :
vous faites un script qui prend en paramètre le fichier à traiter,
fais le traitement en plaçant le résultat dans un fichier temporaire et
remplace l'original par le temporaire

par exemple pour convertir tous les .txt dans un répertoire et ses sous-répertoires :
Code :
1
2
3
 
find TARGET_DIR -name *.txt -exec conv.sh ISO-8859-1 UTF-8 {} \;
rm /tmp/conv.tmp 2> /dev/null
et conv.sh
Code :
1
2
3
4
 
#!/bin/sh
iconv -f "$1" -t "$2" "$3" > /tmp/conv.tmp
cp -f /tmp/conv.tmp "$1"
(notez qu'il serait prudent de gérer les erreurs au cas où la conversion ne serait pas correcte… par exemple avec stat -f %z /tmp/conv.tmp pour tester la taille du fichier généré… - voir aussi l'option -c de iconv)
JeitEmgie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2007, 12h32   #5
Membre Expert
 
Avatar de gifffftane
 
Inscription : février 2007
Messages : 2 354
Détails du profil
Informations personnelles :
Localisation : France, Loire (Rhône Alpes)

Informations forums :
Inscription : février 2007
Messages : 2 354
Points : 2 034
Points : 2 034
Finalement, j'ai préféré me débrouiller avec un shell... en java (le beanshell, plus exactement). Cela te paraitra peut être surprenant, mais il est possible d'écrire un script shell unix en java, et comme je connais nettement mieux ce système...

Voici ce que j'ai écrit (remarque le #! magique de départ) :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
 
#! /bin/bash 
//bin/bash -c "exec java bsh.Interpreter $0 $1 $2";exit 
 
import java.nio.*;
import java.nio.channels.*;
import java.nio.charset.*;
 
scan = new Scanner(System.in);
tmp = File.createTempFile("codeconv", "tmp");
tmp.deleteOnExit(); 
while (scan.hasNextLine())
{
	// lecture et transformation du fichier vers un temporaire
	nomfichier = scan.nextLine();
	in = new File(nomfichier);
	inlength = in.length();
	inf = new FileInputStream(in);
	ouf = new FileOutputStream(tmp);
	inc = inf.getChannel();
	ouc = ouf.getChannel();
	inmap = inc.map(FileChannel.MapMode.READ_ONLY, 0, inlength);
	codein = Charset.forName(bsh.args[0]).newDecoder();
	cbin = codein.decode(inmap);
	codeout = Charset.forName(bsh.args[1]).newEncoder();
	cout = codeout.encode(cbin);
	ouc.write(cout);
	inc.close();
	ouc.close();
 
	// remplacement de l'original par le nouveau
	tmp = new File(tmp.getCanonicalPath());
	oufori = new FileOutputStream(in);
	inftmp = new FileInputStream(tmp);
	oucori = oufori.getChannel();
	inctmp = inftmp.getChannel();
	oucori.transferFrom(inctmp, 0, tmp.length());
	oucori.close();
	inctmp.close(); 
	print("+ "+nomfichier+" fait.");
}
Ce script lit la liste des fichiers à traduire sur l'entrée standard, et les traduit dans l'encodage désiré.

Par exemple :
Citation:
echo -e "Source1.java\nSource2.java" | codeconv.bsh ISO-8859-1 UTF-8
Ainsi je conserve la souplesse des commandes unix pour désigner des fichiers, et pour le traitement, je le fais avec ce que je sais utiliser. La commande file me confirme que l'encodage du fichier a bien changé.

Et pour les améliorations, au moins, je serai nettement plus à l'aise !

Merci pour ton aide.
gifffftane est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2007, 12h57   #6
Rédacteur
 
Inscription : mars 2004
Messages : 1 298
Détails du profil
Informations forums :
Inscription : mars 2004
Messages : 1 298
Points : 1 450
Points : 1 450
Arf, Koff, kofff
l'usine a gaz pour si peut ..........
je comprend mieux le besoin de puissance demusurée : un petrolier pour transporter un verre d'eau
__________________
Marc
Slackware for ever ......
BASH - KSH ( http://marcg.developpez.com/ksh/ )
MarcG est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2007, 13h02   #7
Expert Confirmé
 
Homme
Inscription : septembre 2006
Messages : 2 292
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : septembre 2006
Messages : 2 292
Points : 2 740
Points : 2 740
Citation:
Envoyé par gifffftane
Finalement, j'ai préféré me débrouiller avec un shell... en java (le beanshell, plus exactement). Cela te paraitra peut être surprenant, mais il est possible d'écrire un script shell unix en java, et comme je connais nettement mieux ce système...

Voici ce que j'ai écrit (remarque le #! magique de départ) :
Ce script lit la liste des fichiers à traduire sur l'entrée standard, et les traduit dans l'encodage désiré.



Et pour les améliorations, au moins, je serai nettement plus à l'aise !

Merci pour ton aide.
soit…

mais vous n'avez pas tenu compte de la remarque
"notez qu'il serait prudent de gérer les erreurs au cas où la conversion ne serait pas correcte"

si le fichier source n'est pas converti correctement vous le remplacez quand même par le fichier temporaire… : attention à vos données originales…

dans votre cas, examinez la documentation de decode et encode et vérifiez ce qui se passe en cas d'échec de conversion…
JeitEmgie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2007, 13h47   #8
Membre Expert
 
Avatar de gifffftane
 
Inscription : février 2007
Messages : 2 354
Détails du profil
Informations personnelles :
Localisation : France, Loire (Rhône Alpes)

Informations forums :
Inscription : février 2007
Messages : 2 354
Points : 2 034
Points : 2 034
Ah je vois que ceux qui se lèvent pour Danette sont toujours là, tant mieux pour eux.

Pour ce qui est de la gestion des erreurs, vous avez tout à fait raison. Mais comme on dit, It's a work in progress. D'autant qu'il y a de quoi s'inquieter, puisque j'efface le fichier d'origine ; je vais peut être modifier le code de façon à le sauvegarder d'une façon ou d'une autre, ou bien trouver le moyen de vérifier l'encodage d'origine (pour moi le principal risque est que je me trompe d'encodage d'origine)...

À bientôt.
gifffftane est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h16.


 
 
 
 
Partenaires

Hébergement Web