Unter der Annahme, dass "fremd" "kein ASCII-Zeichen" bedeutet, können Sie find
mit einem Muster alle Dateien suchen, deren Name keine druckbaren ASCII-Zeichen enthält:
LC_ALL=C find . -name '*[! -~]*'
(Das Leerzeichen ist das erste druckbare Zeichen auf http://www.asciitable.com/ und ~
das letzte.)
Der Hinweis für LC_ALL=C
ist erforderlich (tatsächlich LC_CTYPE=C
und LC_COLLATE=C
), andernfalls wird der Zeichenbereich falsch interpretiert. Siehe auch die Handbuchseite glob(7)
. Da LC_ALL=C
Ursachen find
Strings als ASCII zu interpretieren, wird es Multi-Byte - Zeichen (wie gedruckt π
) als Fragezeichen. Um dies zu beheben, cat
leiten Sie eine Pipe an ein Programm (z. B. ) oder leiten Sie in eine Datei um.
Anstatt Zeichenbereiche anzugeben, [:print:]
können auch "druckbare Zeichen" ausgewählt werden. Stellen Sie sicher, dass Sie das Gebietsschema C festlegen, da Sie sonst ein (scheinbar) willkürliches Verhalten erhalten.
Beispiel:
$ touch $(printf '\u03c0') "$(printf 'x\ty')"
$ ls -F
dir/ foo foo.c xrestop-0.4/ xrestop-0.4.tar.gz π
$ find -name '*[! -~]*' # this is broken (LC_COLLATE=en_US.UTF-8)
./x?y
./dir
./π
... (a lot more)
./foo.c
$ LC_ALL=C find . -name '*[! -~]*'
./x?y
./??
$ LC_ALL=C find . -name '*[! -~]*' | cat
./x y
./π
$ LC_ALL=C find . -name '*[![:print:]]*' | cat
./x y
./π
LC_ALL=C
anstelle von verwenden,LC_COLLATE=C
da es nicht sehr sinnvoll ist, LC_COLLATE ohne Einstellung auf C zu setzenLC_CTYPE
und sicherzustellen, dass es auch dann noch funktioniert, wenn sich die Variable LC_ALL in der Umgebung befindet.SPC
es druckbar ist , was ist dann damitTAB
undLF
welche sind in der Regel auch in Textdateien zu finden?LC_COLLATE
undLC_CTYPE
siehe auch diefind(1)
Manpage.Wenn Sie jeden Dateinamen mit übersetzen
tr -d '[\200-\377]'
und mit dem ursprünglichen Namen vergleichen, stimmen alle Dateinamen mit Sonderzeichen nicht überein.(Die obige Annahme, dass Sie Nicht-ASCII mit fremd bedeuten)
quelle
[
und]
in den meistentr
Implementierungen.[
und]
auf meinem System.[
und]
s) gefunden. Vielen Dank.Sie können ein
tr
beliebiges Fremdzeichen aus einem Dateinamen löschen und das Ergebnis mit dem Originaldateinamen vergleichen, um festzustellen, ob es Fremdzeichen enthält.quelle
find
Ausgabe nachbearbeiten möchten , verwenden Sie die NUL-terminierte Ausgabe / Eingabe, wie in dieser Antwort gezeigt .Die akzeptierte Antwort ist hilfreich, aber wenn sich Ihre Dateinamen bereits in der in
LANG
/ angegebenen Kodierung befindenLC_CTYPE
, ist es besser, einfach Folgendes zu tun:Zeichenklassen sind betroffen
LC_CTYPE
, der obige Befehl verwendet jedoch keine Zeichenklassen, sondern nur Bereiche, sodassLC_CTYPE
nur verhindert wird , dass ungewöhnliche Zeichen durch Fragezeichen ersetzt werden.quelle