2010-06-10 4 views
4

J'ai un tas de fichiers musicaux sur une partition NTFS montée sur linux qui ont des noms de fichiers avec des caractères Unicode. J'ai du mal à écrire un script pour renommer les fichiers afin que tous les noms de fichiers utilisent uniquement des caractères ASCII. Je pense que l'utilisation de la commande iconv devrait fonctionner, mais j'ai du mal à échapper les caractères de la commande 'mv'.Comment puis-je convertir les noms de fichiers d'unicode en ascii

EDIT: Cela n'a pas d'importance s'il n'y a pas de traduction directe pour les caractères Unicode. Je suppose que je vais juste remplacer ceux avec un "?" personnage.

+0

Langue? Si c'est bash, mettez-le entre guillemets? S'il s'agit d'une autre langue, n'appelez pas mv, appelez le syscall approprié? – Thanatos

+0

En outre, que faisons-nous si nous trouvons un caractère Unicode?火 n'a pas d'équivalent ASCII. – Thanatos

Répondre

2

Je ne pense pas iconv a toutes les facilités de remplacement de caractère. Cela en Python pourrait aider:

#!/usr/bin/python 
import sys 

def unistrip(s): 
    if isinstance(s, str): 
     s = s.decode('utf-8') 
    chars = [] 
    for i in s: 
     if ord(i) > 0x7f: 
      chars.append(u'?') 
     else: 
      chars.append(i) 
    return u''.join(chars) 

if __name__ == '__main__': 
    print unistrip(sys.argv[1]) 

appellent Puis, comme:

$ ./unistrip.py "yikes__oh_look_a_file_火" 
yikes_?_oh_look_a_file_? 

aussi:

$ mv "yikes__oh_look_a_file_火" "`./unistrip.py "yikes__oh_look_a_file_火"`" 

Vous pourriez tester un peu d'abord. Pour les opérations de déplacement de grande taille, il est conseillé de générer une liste de commandes mv (c'est-à-dire d'écrire du code pour écrire un script), car vous pouvez consulter les commandes de déplacement avant de leur demander d'exécuter.

+1

'return s.encode ('ascii', 'replace')' –

+0

Corrigez-moi si je me trompe, mais je pense que 'iconv' a des installations de remplacement de caractères: http://stackoverflow.com/questions/1975057/ bash-convertir-non-ascii-caractères-en-ascii –

2

convmv est un bon script Perl pour convertir les encodages de nom de fichier. Mais il ne peut pas gérer les caractères qui ne sont pas dans le codage de destination.

Vous pouvez changer n'importe quel caractère non en ASCII en '?' en utilisant l'utilitaire renommer distribué avec Perl:

rename 's/[^ -~]/?/g' * 

Malheureusement, cela remplace les caractères multi-octets avec plusieurs '?' s. Selon le codage Unicode utilisé et les caractères impliqués dans la modification de l'expression régulière peuvent aider, par ex.

rename 's/[^ -~]{2}/?/g' * 

pour les caractères de 2 octets.

3

Parfois, mv ne sera pas en mesure de lire le nom de fichier dans un shell, de sorte que vous pouvez essayer la référence inode.

Pour obtenir le inode d'un fichier:

$ ls -il

sortie sera quelque chose comme ceci:

13377799 -rw-r--r-- 1 draco draco  11809 Apr 25 01:39 some_filename.ext 
9340462 -rw-r--r-- 1 draco draco  81648 Apr 23 02:27 some_strange_filename.ext 
9340480 -rw-r--r-- 1 draco draco  4717 Apr 23 03:54 yikes__oh_look_a_file_火 

Utilisez ensuite find pour obtenir votre fichier et peut-être en utilisant le code python par Thanatos :

$ find . -inum 9340480 -exec ./unistrip.py {} \;

Vous pouvez également utiliser la commande ci-dessus avec iconv dans un shell.

J'espère que cela aidera quelqu'un et excusez-moi pour toute erreur [première réponse].

Questions connexes