OVH Cloud OVH Cloud

Encodage des filename dans tar

14 réponses
Avatar
Nicolas Pontoizeau
Bonjour,

J'ai archivé mon compte sur une machine dont la locale était en
iso-8856-15 (latin 1) mais quand je détare le tout sur ma machine qui
elle est en utf-8 les caractères accentués ne passent plus. C'est assez
logique mais existe-t-il une option dans tar pour palier à ce problème?
J'ai dans les pages info sans trouver de réponse. Y a-t-il une méthode
pour éviter ce problème?

Merci,

--
http://www.nicolas.pontoizeau.org/
Nicolas Pontoizeau - Promotion EFREI 2005

10 réponses

1 2
Avatar
Laurent Wacrenier
Nicolas Pontoizeau <pontoize*NOSPAM*@Efrei.fr.invalid> écrit:
J'ai archivé mon compte sur une machine dont la locale était en
iso-8856-15 (latin 1) mais quand je détare le tout sur ma machine qui
elle est en utf-8 les caractères accentués ne passent plus. C'est assez


Que signifie précisément "ne passent plus" ?

Avatar
Nicolas George
Nicolas Pontoizeau wrote in message
<slrnd5t3g3.nmb.pontoize*NOSPAM*@choam.unix.efrei.fr>:
J'ai archivé mon compte sur une machine dont la locale était en
iso-8856-15 (latin 1) mais quand je détare le tout sur ma machine qui
elle est en utf-8 les caractères accentués ne passent plus.


Petite clarification : les noms de fichiers sous Unix sont des chaînes
d'octets, toutes les valeurs étant permises sauf 0x00 et 0x2F (ce dernier
étant / en ASCII)¹. La relation entre ces suites d'octets et des caractères
n'est faite qu'à l'affichage ou la saisie, et c'est seulement à ce moment-là
qu'une éventuelle locale peut intervenir. En particulier, tar n'a aucune
notion de locale dans les noms de fichiers, et la séquence
archivage-désarchivage préserve fidellement ces noms, en tant que chaînes
d'octets.

Pour recoder les noms de fichiers, on peut chercher du côté de programmes
comme convmv.

Pour l'avenir, personnellement, je conseille de restreindre les noms de
fichiers autant que possible aux caractères [a-zA-Z0-9_,.+:@-]. C'est une
contrainte mineure, et ça évite bien des ennuis.


1 : certains filesystems exotiques peuvent poser des restrictions plus
strictes, voire même avoir des notions d'encodages à des endroits bizarres ;
ce n'est normalement pas visible en userland au delà du fait qu'un nom de
fichier peut être rejeté.

Avatar
Laurent Wacrenier
Nicolas Pontoizeau <pontoize*NOSPAM*@Efrei.fr.invalid> écrit:
Nicolas Pontoizeau <pontoize*NOSPAM*@Efrei.fr.invalid> écrit:
J'ai archivé mon compte sur une machine dont la locale était en
iso-8856-15 (latin 1) mais quand je détare le tout sur ma machine qui
elle est en utf-8 les caractères accentués ne passent plus. C'est assez


Que signifie précisément "ne passent plus" ?


exemple :
filename en ISO devient filename en utf-8
français.pdf -> fran?ais.pdf (unicode non valide)


Donc les fichiers sont effectivement écrits et sont accessibles ?

Il n'y a qu'à convertir les noms des répertoires et des fichiers à
grands coups de "iconv -f iso-8859-15 -t utf-8"

Si l'archive peut être refaite, un GNU tar récent peut éventuelement
traiter celà avec "tar --format=posix" ou "tar --format=pax".



Avatar
Nicolas Pontoizeau
Nicolas Pontoizeau <pontoize*NOSPAM*@Efrei.fr.invalid> écrit:
J'ai archivé mon compte sur une machine dont la locale était en
iso-8856-15 (latin 1) mais quand je détare le tout sur ma machine qui
elle est en utf-8 les caractères accentués ne passent plus. C'est assez


Que signifie précisément "ne passent plus" ?


exemple :
filename en ISO devient filename en utf-8
français.pdf -> fran?ais.pdf (unicode non valide)

--
http://www.nicolas.pontoizeau.org/
Nicolas Pontoizeau - Promotion EFREI 2005


Avatar
Nicolas Pontoizeau

Petite clarification : les noms de fichiers sous Unix sont des chaînes
d'octets, toutes les valeurs étant permises sauf 0x00 et 0x2F (ce dernier
étant / en ASCII)¹. La relation entre ces suites d'octets et des caractères
n'est faite qu'à l'affichage ou la saisie, et c'est seulement à ce moment-là
qu'une éventuelle locale peut intervenir. En particulier, tar n'a aucune
notion de locale dans les noms de fichiers, et la séquence
archivage-désarchivage préserve fidellement ces noms, en tant que chaînes
d'octets.


Précieuse clarification merci!

Pour recoder les noms de fichiers, on peut chercher du côté de programmes
comme convmv.


cool!

Pour l'avenir, personnellement, je conseille de restreindre les noms de
fichiers autant que possible aux caractères [a-zA-Z0-9_,.+:@-]. C'est une
contrainte mineure, et ça évite bien des ennuis.


Hum bon je vais renommer tous mes fichiers en caractères chinois alors.
C'est bien que je fasse gaffe maintenant je n'ai que 300 fichiers au
noms chinois :( C'est quand même pas pratique du tout que tout le monde
ne soit pas en utf-8...

--
http://www.nicolas.pontoizeau.org/
Nicolas Pontoizeau - Promotion EFREI 2005

Avatar
Nicolas Pontoizeau
Donc les fichiers sont effectivement écrits et sont accessibles ?


oui c'est juste le nom qui est altéré.

Il n'y a qu'à convertir les noms des répertoires et des fichiers à
grands coups de "iconv -f iso-8859-15 -t utf-8"


Hum sur les fichier pdf ça m'a pas donné quelque chose de concluant. Le
fichier était vide (blanc).
Quel est la différence entre iconv et recode? J'utilise recode pour les
fichier texte et il marche bien.

Si l'archive peut être refaite, un GNU tar récent peut éventuelement
traiter celà avec "tar --format=posix" ou "tar --format=pax".


:~$ tar --version
tar (GNU tar) 1.13.93

il ne connait pas format :(

--
http://www.nicolas.pontoizeau.org/
Nicolas Pontoizeau - Promotion EFREI 2005

Avatar
Laurent Wacrenier
Nicolas Pontoizeau <pontoize*NOSPAM*@Efrei.fr.invalid> écrit:
Il n'y a qu'à convertir les noms des répertoires et des fichiers à
grands coups de "iconv -f iso-8859-15 -t utf-8"


Hum sur les fichier pdf ça m'a pas donné quelque chose de concluant. Le
fichier était vide (blanc).
Quel est la différence entre iconv et recode? J'utilise recode pour les
fichier texte et il marche bien.


Lancer iconv sur le nom du fichier.
Pas sur le fichier.


Si l'archive peut être refaite, un GNU tar récent peut éventuelement
traiter celà avec "tar --format=posix" ou "tar --format=pax".


:~$ tar --version
tar (GNU tar) 1.13.93

il ne connait pas format :(


Depuis 1.14.x, la dernière est la 1.15.


Avatar
Pascal Bourguignon
Nicolas Pontoizeau <pontoize*NOSPAM*@Efrei.fr.invalid> writes:

Donc les fichiers sont effectivement écrits et sont accessibles ?


oui c'est juste le nom qui est altéré.

Il n'y a qu'à convertir les noms des répertoires et des fichiers à
grands coups de "iconv -f iso-8859-15 -t utf-8"


Hum sur les fichier pdf ça m'a pas donné quelque chose de concluant. Le
fichier était vide (blanc).
Quel est la différence entre iconv et recode? J'utilise recode pour les
fichier texte et il marche bien.


:-)

for file_name in * ; do
new_name="$( echo "$file_name" | iconv -f iso-8859-15 -t utf-8 )"
[ "$new_name" = "$file_name" ] || mv "$file_name" "$new_name"
done

S'il y a des répertoires, je fais:

find . -print | sort -r
| while read f ; do
old_name="$(basename "$f")"
new_name="$( echo "$old_name" | iconv -f iso-8859-15 -t utf-8 )"
[ "$new_name" = "$old_name" ]
|| mv "$(dirname "$f")/$old_name" "$(dirname "$f")/$new_name"
done


--
__Pascal Bourguignon__ http://www.informatimago.com/

Nobody can fix the economy. Nobody can be trusted with their finger
on the button. Nobody's perfect. VOTE FOR NOBODY.


Avatar
Pascal Bourguignon
Nicolas George <nicolas$ writes:

Nicolas Pontoizeau wrote in message
<slrnd5t3g3.nmb.pontoize*NOSPAM*@choam.unix.efrei.fr>:
J'ai archivé mon compte sur une machine dont la locale était en
iso-8856-15 (latin 1) mais quand je détare le tout sur ma machine qui
elle est en utf-8 les caractères accentués ne passent plus.


Petite clarification : les noms de fichiers sous Unix sont des chaînes
d'octets, toutes les valeurs étant permises sauf 0x00 et 0x2F (ce dernier
étant / en ASCII)¹. La relation entre ces suites d'octets et des caractères
n'est faite qu'à l'affichage ou la saisie, et c'est seulement à ce moment-là
qu'une éventuelle locale peut intervenir. En particulier, tar n'a aucune
notion de locale dans les noms de fichiers, et la séquence
archivage-désarchivage préserve fidellement ces noms, en tant que chaînes
d'octets.

Pour recoder les noms de fichiers, on peut chercher du côté de programmes
comme convmv.

Pour l'avenir, personnellement, je conseille de restreindre les noms de
fichiers autant que possible aux caractères [a-zA-Z0-9_,.+:@-]. C'est une
contrainte mineure, et ça évite bien des ennuis.


Éviter: ':'

- séparateur de répertoire sur HFS (MacOS),
- séparateur de device sur Microsoft Windows, et VMS si je ne me trompe.


Sur les CD-ROM ISO9660, prévus pour pouvoir être lus dans le plus grand
nombre d'environnement, les caractères pouvant être utilisés dans les
noms de fichiers sont:

D-CHARS = "0123456789BCDEFGHIJKLMNOPQRSTUVWXYZ_"

Le point sert pour séparer un nom de 1 à 8 caractères d'une extension
de 1 à 3 caractères.

Ça ne va pas chercher loin... Personnellement je me permet les
minuscules et le tiret à la place du soulignet.


1 : certains filesystems exotiques peuvent poser des restrictions plus
strictes, voire même avoir des notions d'encodages à des endroits bizarres ;
ce n'est normalement pas visible en userland au delà du fait qu'un nom de
fichier peut être rejeté.


--
__Pascal Bourguignon__ http://www.informatimago.com/

In a World without Walls and Fences,
who needs Windows and Gates?


Avatar
Nicolas Pontoizeau
:-)


Ok je vois comment il fallait faire maintenant...

for file_name in * ; do
new_name="$( echo "$file_name" | iconv -f iso-8859-15 -t utf-8 )"
[ "$new_name" = "$file_name" ] || mv "$file_name" "$new_name"
done


Super!

S'il y a des répertoires, je fais:

find . -print | sort -r
| while read f ; do
old_name="$(basename "$f")"
new_name="$( echo "$old_name" | iconv -f iso-8859-15 -t utf-8 )"
[ "$new_name" = "$old_name" ]
|| mv "$(dirname "$f")/$old_name" "$(dirname "$f")/$new_name"
done


Génial merci pour toutes les astuces!

--
http://www.nicolas.pontoizeau.org/
Nicolas Pontoizeau - Promotion EFREI 2005

1 2