Frage

Zu Debugging-Zwecken muss ich rekursiv ein Verzeichnis nach allen Dateien durchsuchen, die mit einer UTF-8-Byte-Bestellmarke (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, unleserliche 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 Zeilenpause enthalten, aber solche Dateien sind ohnehin nicht zu erwarten.

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

Gibt es interessante Textredakteure oder Makros für Textredakteure?

War es hilfreich?

Lösung

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

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

Ich liebe "finde" :) :)

WarnungDer obige Wille ändern Binärdateien, die diese drei Zeichen enthalten.

.

Wenn Sie nur BOM -Dateien anzeigen möchten, verwenden Sie Folgendes:

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

Andere Tipps

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

Total Commander → Gehen Sie zu den Root Dird von Project → Dateien suchen (Alt + F7) → Dateitypen *. * → Text "ef bb bf" → Überprüfen Sie das Kontrollkästchen → Suche

Und du bekommst die Liste :)

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, sodass sie etwas schneller sein sollte.

Wenn Sie einige falsch positive Ergebnisse akzeptieren (falls es Nicht-Text-Dateien gibt oder im unwahrscheinlichen Fall ein zwnbsp in der Mitte einer Datei vorhanden ist), können Sie Grep verwenden:

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

Ich würde so etwas wie:

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

Dies wird sicherstellen, dass die BOM ab dem ersten Byte der Datei stattfindet.

Sie können verwenden grep um sie zu finden und Perl, um sie so auszuziehen:

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

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

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

phptags --warn ./

Wird so etwas wie:

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

Und die --whitespace Der Modus wird solche Probleme automatisch beheben (rekursiv, behauptet jedoch, dass er nur .php -Skripte umschreibt.)

find -type f -print0 | xargs -0 grep -l `printf '^\xef\xbb\xbf'` | sed 's/^/found BOM in: /'
  • find -print0 Steckt einen Null 0 zwischen jeden Dateinamen, anstatt neue Zeilen zu verwenden
  • xargs -0 erwartet null getrennte Argumente anstelle der getrennten Linie
  • grep -l listet die Dateien auf, die dem Regex übereinstimmen
  • Die Regex ^\xeff\xbb\xbf Ist nicht ganz richtig, da es nicht gebundene UTF-8-Dateien übereinstimmt, wenn sie zu Beginn einer Zeile keine Breitenräume haben

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 \;

Wenn Sie nach UTF -Dateien suchen, die Dateibefehl Arbeiten. Es wird Ihnen sagen, wie die Kodierung der Datei ist. Wenn es dort keine ASCII -Zeichen gibt, wird es UTF erstellen.

file *.php | grep UTF

Das wird jedoch nicht rekursiv funktionieren. Sie können wahrscheinlich einen ausgefallenen Befehl aufstellen, um es rekursiv zu machen, aber ich habe einfach jede Ebene einzeln wie die folgenden durchsucht, bis mir die Levels ausgegangen bin.

file */*.php | grep UTF
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top