2009-03-08 14 views
3

O/S = Code de Fedora 9.Trouvez non-UTF8 sur Linux noms de fichiers système de fichiers

J'ai un certain nombre de fichiers cachés dans mes LANG = en_US: système de fichiers UTF8 qui ont été téléchargés avec des personnages méconnaissables dans leur nom de fichier.

je besoin de chercher le système de fichiers et retourner tous les noms qui ont au moins un caractère qui ne sont pas dans la gamme standard (a-zA-Z0-9 et.-_, Etc.)

J'ai essayé à suivre mais pas de chance.

find . | egrep [^a-zA-Z0-9_\.\/\-\s] 

Toutes les suggestions seraient les bienvenues.

Cheers,

AP.

+1

Pourquoi? D'autres sont parfaitement bien, aussi longtemps qu'ils sont correctement codés –

Répondre

12

convmv peut être intéressant pour vous. Il ne trouve pas seulement ces fichiers, mais prend également en charge les renommer pour corriger les noms de fichiers (s'il peut deviner ce qui s'est mal passé).

+0

J'avais plus de 1000 fichiers avec l'encodage Windows 1252 et beaucoup de trémas. "convmv -r -f cp1252 -t utf8 --notest." travaillé pour moi. Je ne savais pas qu'il y avait un tel programme. Merci! – sl0815

1

trouver. | egrep [^ a-zA-Z0-9 _./- \ s]

Danger, obus s'échappant! Bash va interpréter ce dernier paramètre, en supprimant un niveau d'échappement à barre oblique inverse (0). Essayez de mettre des guillemets doubles autour de l'expression "[^ group]".

Bien sûr, cela interdit beaucoup plus que UTF-8. Il est possible de construire une regex pour correspondre à des chaînes UTF-8 valides, mais c'est plutôt moche. Si vous avez Python 2.x disponibles, vous pouvez profiter de cette:

import os.path 
def walk(dir): 
    for child in os.listdir(dir): 
     child= os.path.join(dir, child) 
     if os.path.isdir(child): 
      for descendant in walk(child): 
       yield descendant 
     yield child 

for path in walk('.'): 
    try: 
     u= unicode(path, 'utf-8') 
    except UnicodeError: 
     # print path, or attempt to rename file 
+0

Les guillemets simples seraient meilleurs, dans ce contexte. – Arafangion

0

J'ai eu un problème similaire à l'OP pour laquelle on m'a donné un solution sur Superuser (voir aussi further comments) que j'ai trouvé plus satisfaisant que la "solution de convmv", bien que j'apprécie d'avoir découvert comvmv aussi. Pourquoi ne devraient-ils autoriser que ces caractères?

5
find . | perl -ane '{ if(m/[[:^ascii:]]/) { print } }' 
+0

Cela a fonctionné parfaitement pour moi, merci! – VirtualWolf