Zum Debuggen muss ich rekursiv ein Verzeichnis nach allen Dateien durchsuchen, die mit einer UTF-8-Byte-Ordnungsmarke (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, unlesbare 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?
quelle
grep -rlI $'\xEF\xBB\xBF' .
diese Option, um Binärdateien zu ignorieren.Der beste und einfachste Weg, dies unter Windows zu tun:
Total Commander → gehe zum Stammverzeichnis des Projekts → finde Dateien ( Alt+F7 ) → Dateitypen *. * → Suchen Sie nach Text "EF BB BF" → Aktivieren Sie das Kontrollkästchen 'Hex' → Suchen
Und du bekommst die Liste :)
quelle
Die meisten der oben angegebenen 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, daher sollte sie etwas schneller sein.
quelle
find . -type f -print0 | xargs -0 awk '/^\xEF\xBB\xBF/ {print FILENAME} {nextfile}'
Wenn Sie einige Fehlalarme akzeptieren (falls es keine Textdateien gibt oder im unwahrscheinlichen Fall ein ZWNBSP in der Mitte einer Datei), können Sie grep verwenden:
quelle
Ich würde so etwas verwenden wie:
Dadurch wird sichergestellt, dass die Stückliste ab dem ersten Byte der Datei erstellt wird.
quelle
Sie können sie verwenden
grep
, um sie zu finden, und Perl, um sie wie folgt zu entfernen:quelle
Informationen für einen Windows-Benutzer finden Sie hier (gutes PHP-Skript zum Auffinden des
BOM
in Ihrem Projekt).quelle
Eine Overkill-Lösung hierfür ist
phptags
(nicht das gleichnamigevi
Tool), das speziell nach PHP-Skripten sucht:Gibt etwas aus wie:
Und der
--whitespace
Modus behebt solche Probleme automatisch (rekursiv, behauptet jedoch, dass nur .php-Skripte neu geschrieben werden.)quelle
find -print0
Setzt zwischen jedem Dateinamen eine Null \ 0, anstatt neue Zeilen zu verwendenxargs -0
erwartet null getrennte Argumente anstelle von zeilengetrenntengrep -l
listet die Dateien auf, die dem regulären Ausdruck entsprechen^\xeff\xbb\xbf
reguläre Ausdruck ist nicht ganz korrekt, da er mit UTF-8-Dateien ohne BOMed übereinstimmt, wenn sie am Anfang einer Zeile Leerzeichen mit einer Breite von Null habenquelle
Ich habe dies verwendet, um nur JavaScript-Dateien zu korrigieren:
quelle
Wenn Sie nach UTF-Dateien suchen, funktioniert der Befehl file . Hier erfahren Sie, wie die Codierung der Datei lautet. Wenn sich dort Nicht-ASCII-Zeichen befinden, wird UTF angezeigt.
Das wird aber nicht rekursiv funktionieren. Sie können wahrscheinlich einen ausgefallenen Befehl erstellen, um ihn rekursiv zu machen, aber ich habe jede Ebene einzeln wie folgt durchsucht, bis mir die Ebenen ausgegangen sind.
quelle