2009-03-08 7 views
3

O/S = Fedora-Code 9.Suche Non-UTF8-Dateinamen auf Linux File System

Ich habe eine Reihe von Dateien in meiner LANG = en_US versteckt: UTF8-Dateisystem, das in mit nicht erkennbaren Zeichen hochgeladen wurde, um ihr Dateiname.

Ich brauche das Dateisystem und kehren alle Dateinamen zu suchen, die mindestens ein Zeichen, die nicht im Standardbereich (a-zA-Z0-9 und.-_ Etc.)

Ich habe versucht worden zu folgen, aber kein Glück.

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

Alle Vorschläge wären willkommen.

Prost,

AP.

+1

Warum sollten sie nur diese Zeichen erlauben? Andere sind auch völlig in Ordnung, solange sie korrekt codiert sind –

Antwort

12

convmv könnte für Sie interessant sein. Es findet nicht nur diese Dateien, sondern unterstützt auch das Umbenennen von Dateien, um die Dateinamen zu korrigieren (wenn es raten kann, was schief gelaufen ist).

+0

Ich hatte 1000 + Dateien mit Windows 1252-Codierung und viele Umlaute. "convmv -r -f cp1252 -t utf8 --notest." hat für mich gearbeitet. Wusste nicht, dass es ein solches Programm gab. Vielen Dank! – sl0815

1

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

Gefahr, Schale entweichen!

Bash wird diesen letzten Parameter interpretieren und eine Stufe des Backslash-Escaping entfernen. Setzen Sie doppelte Anführungszeichen um den Ausdruck "[^ group]".

Auch das lässt natürlich viel mehr als UTF-8. Es ist possible, um eine Regex zu erstellen, um gültige UTF-8-Strings zu entsprechen, aber es ist ziemlich hässlich. Wenn Sie Python 2.x zur Verfügung haben Sie die Vorteile, dass nehmen könnten:

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

Einfache Anführungszeichen wären in diesem Zusammenhang besser. – Arafangion

0

Ich hatte ein ähnliches Problem mit dem OP, für die ich ein solution auf Superuser gegeben wurde (siehe auch further comments), dass ich mehr zufrieden stellend als die "convmv solution", obwohl ich es auch schätze, comvmv entdeckt zu haben.

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

Das hat perfekt für mich funktioniert, danke! – VirtualWolf