2010-12-05 3 views
3

Ich habe versucht, eine ähnliche Frage wie meine (Find Non-UTF8 Filenames on Linux File System) zu markieren, um weitere Antworten zu erhalten, bisher ohne Erfolg geht wieder ...Mit find oder grep nach Dateinamen mit akzentuierten Zeichen aus einem anderen Codierungssystem (Windows nach Linux) suchen

Ich habe das gleiche Problem wie das OP in der Verbindung oben und Convmv ist ein großartiges Werkzeug, um das eigene Dateisystem zu reparieren. Meine Frage ist daher akademisch, aber ich finde es unbefriedigend (in der Tat kann ich nicht glauben), dass "finden" nicht in der Lage ist, nicht standardmäßige ASCII-Zeichen zu finden.

Gibt es jemanden, der weiß, welche Kombination von Optionen zu finden Dateinamen, die nicht standardmäßige Zeichen auf, was ein Unicode FS zu sein scheint, in meinem Fall scheinen die Zeichen 8bits ascii anstatt Unicode erweitert werden, Die Dateien kommen von einer Windows-Maschine (iso-8859-1) und ich muss sie regelmäßig holen. Ich würde gerne sehen, wie finden und/oder Grep kann das gleiche wie Convmv.

Beispieldateien:

> ls 
Abc�def ÉÈéèáà-rest everest éverest 

> ls -b 
Abc\251def ÉÈéèáà-rest everest éverest 

Erste Datei stammt aus dem Windows (oder simuliert mit touch $(printf "Abc\xA9def")).

Fehlende fast alle (der Bindestrich speichert diese Datei, kann mit farbigen Grep gesehen werden). Was auch immer hier geschieht, ist nicht das, was ich erwarten würde: weder finden noch grep ist in der Lage, einen akzentuierten Buchstaben als außerhalb des vorgesehenen Bereichs zu nehmen. [^ A-zA-Z. /].

Bizarr beide sind in der Lage, einen Standardakzent aufzunehmen, wenn sie (einschließlich im Bereich) zur Verfügung gestellt werden. Jeder Find- oder Grep-Versuch mit \ xA9, \ 0251 oder \ o251 schlägt fehl (keine Übereinstimmung).

Auf der Suche nach einem nicht umstrittenen Zeichen zeigt alle Dateien mit grep, wie ich es erwartet hätte.

> find . -regex '.*e.*' 
./éverest 
./ÉÈéèáà-rest 
./everest 

> find . -name '*e*' 
./éverest 
./ÉÈéèáà-rest 
./everest 

Fund ist jedoch sehr diskriminierend: sogar ein normales Zeichen nach oben, scheint es mir, dass es eliminiert Dateinamen, die Zeichen außerhalb des Bereichs der zulässigen Zeichen für das Dateisystem des Namens Codierungsschema enthalten.

Soweit es mich betrifft, wenn die Datei im Dateisystem ist, dann sollte finden Sie es finden, richtig? Aber vielleicht gibt es ein Feature, von dem ich nichts weiß?

Alle Einsichten würden sehr geschätzt werden.

+0

möglich Duplikat von [(grep) Regex Nicht-ASCII-Zeichen übereinstimmen?] (Http://stackoverflow.com/questions/2124010/grep-regex-to-match-non-ascii-characters) – marcog

+0

Ich habe wirklich fiese Dinge gesehen, die mit Dateisystemen zusammenhängen, weil es widersprüchliche Vorstellungen über die Kodierung von Dateinamen gibt.Ich denke nicht, dass die Suche nach Nicht-ASCII auch das sehr gut angeht, weil es zu viele andere Probleme gibt, die an den Rändern lauern. Gab es nichts über Superuser? – tchrist

+0

@marcog: definitiv kein Duplikat. @tchrist: Ich habe dieselbe Frage an Superuser gestellt und Jander kam mit einer Antwort zurück, siehe meine Antwort auf diesen Beitrag. – asoundmove

Antwort

0

Jander answered to the same question I posted on Super User

Jander Antwort macht den Job perfekt, für die Interessenten in mehr bekommen diese aus, ist hier noch ein Tipp.

Mit LANG = C, finden Sie nicht-ASCII-Zeichen mit Fragezeichen. Um dies mit diesem Dateisystem in die normale Anzeige zurück zu konvertieren, leiten Sie die Ausgabe einfach an cat.

LANG=C find . -regex '.*[^a-zA-Z./-].*' 
./??verest 
./????????????-rest 
./Abc?def 

LANG=C find . -regex '.*[^a-zA-Z./-].*' | cat 
./éverest 
./ÉÈéèáà-rest 
./Abc�def 
Verwandte Themen