web-dev-qa-db-de.com

Elegante Suche nach UTF-8-Dateien mit Stückliste?

Zu Debugging-Zwecken muss ich rekursiv in einem Verzeichnis nach allen Dateien suchen, die mit einer UTF-8-Bytereihenfolge (BOM) beginnen. Meine aktuelle Lösung ist ein einfaches Shell-Skript:

find -type f |
while read file
do
    if [ "`head -c 3 -- "$file"`" == $'\xef\xbb\xbf' ]
    then
        echo "found BOM in: $file"
    fi
done

Oder, wenn Sie kurze, nicht lesbare Einzeiler bevorzugen:

find -type f|while read file;do [ "`head -c3 -- "$file"`" == $'\xef\xbb\xbf' ] && echo "found BOM in: $file";done

Es funktioniert nicht mit Dateinamen, die einen Zeilenumbruch enthalten, __. Aber solche Dateien sind sowieso nicht zu erwarten.

Gibt es eine kürzere oder elegantere Lösung?

Gibt es interessante Texteditoren oder Makros für Texteditoren?

83
vog

Was ist mit diesem einfachen Befehl, der nicht nur böse BOM findet, sondern auch löscht? :)

find . -type f -exec sed '1s/^\xEF\xBB\xBF//' -i {} \;

Ich liebe "finden" :)

Warning Die obigen Binärdateien modified, die diese drei Zeichen enthalten.

.

Wenn Sie nur Stücklistendateien anzeigen möchten, verwenden Sie diese:

grep -rl $'\xEF\xBB\xBF' .
152
Denis

Der beste und einfachste Weg, dies unter Windows zu tun:

Total Commander → gehe zum Hauptverzeichnis des Projekts → finde Dateien (Alt + F7) → Dateitypen *. * → Finden Sie den Text "EF BB BF" → Aktivieren Sie das Kontrollkästchen "Hex" → Suchen

Und du bekommst die Liste :)

39
Jan Przybylo
find . -type f -print0 | xargs -0r awk '
    /^\xEF\xBB\xBF/ {print FILENAME}
    {nextfile}'

Die meisten der oben genannten Lösungen testen mehr als die erste Zeile der Datei, auch wenn einige (wie die Lösung von Marcus) die Ergebnisse filtern. Diese Lösung testet nur die erste Zeile jeder Datei und sollte daher etwas schneller sein.

12
Aron Griffis

Wenn Sie einige Fehlalarme akzeptieren (falls es sich nicht um Textdateien handelt oder in dem unwahrscheinlichen Fall ein ZWNBSP mitten in einer Datei vorhanden ist), können Sie grep verwenden:

fgrep -rl `echo -ne '\xef\xbb\xbf'` .
7
CesarB

Sie können grep verwenden, um sie zu finden, und Perl, um sie wie folgt zu entfernen:

grep -rl $'\xEF\xBB\xBF' . | xargs Perl -i -pe 's{\xEF\xBB\xBF}{}'
5
theory

Ich würde etwas verwenden wie:

grep -orHbm1 "^`echo -ne '\xef\xbb\xbf'`" . | sed '/:0:/!d;s/:0:.*//'

Dadurch wird sichergestellt, dass die Stückliste ab dem ersten Byte der Datei beginnt.

5
Marcus Griep

Für einen Windows-Benutzer siehe this (gutes PHP - Skript zum Ermitteln der BOM in Ihrem Projekt).

4
julien

Eine Overkill-Lösung hierfür ist phptags (nicht das vi-Tool mit demselben Namen), das speziell nach PHP -Skripten sucht:

phptags --warn ./

Wird etwas ausgeben wie:

./invalid.php: TRAILING whitespace ("?>\n")
./invalid.php: UTF-8 BOM alone ("\xEF\xBB\xBF")

Der --whitespace-Modus behebt solche Probleme automatisch (rekursiv, gibt jedoch an, dass nur .php-Skripts neu geschrieben werden.)

3
mario

Ich habe dies verwendet, um nur JavaScript-Dateien zu korrigieren:

find . -iname *.js -type f -exec sed 's/^\xEF\xBB\xBF//' -i.bak {} \; -exec rm {}.bak \;
2
Refineo
find -type f -print0 | xargs -0 grep -l `printf '^\xef\xbb\xbf'` | sed 's/^/found BOM in: /'
  • find -print0 setzt eine Null\0 zwischen jedem Dateinamen, anstatt neue Zeilen zu verwenden
  • xargs -0 erwartet null getrennte Argumente anstelle von getrennten Zeilen
  • grep -l listet die Dateien auf, die der Regex entsprechen
  • Der reguläre Ausdruck ^\xeff\xbb\xbf ist nicht ganz korrekt, da er mit nicht-bomierten UTF-8-Dateien übereinstimmt, wenn sie am Zeilenanfang ein Leerzeichen mit der Breite Null haben
2
Jonathan Wright

Wenn Sie nach UTF-Dateien suchen, funktioniert der Befehl file . Es wird Ihnen sagen, wie die Kodierung der Datei ist. Wenn dort keine ASCII -Zeichen vorhanden sind, wird UTF angezeigt.

file *.php | grep UTF

Das funktioniert aber nicht rekursiv. Sie können wahrscheinlich einen ausgefallenen Befehl erstellen, um ihn rekursiv zu machen, aber ich habe jedes Level einzeln wie folgt durchsucht, bis mir die Levels ausgehen.

file */*.php | grep UTF
0
Mike Dotterer