BOMでUTF-8ファイルを検索するエレガントな方法は?


94

デバッグの目的で、UTF-8バイトオーダーマーク(BOM)で始まるすべてのファイルをディレクトリで再帰的に検索する必要があります。私の現在の解決策は簡単なシェルスクリプトです:

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

または、短くて読めないワンライナーを好む場合:

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

改行を含むファイル名では機能しませんが、このようなファイルはとにかく予期されていません。

より短いまたはよりエレガントな解決策はありますか?

興味深いテキストエディタやテキストエディタ用のマクロはありますか?

回答:


166

厄介なBOMを見つけるだけでなく、クリアするこの1つの単純なコマンドはどうですか?:)

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

「検索」が大好きです:)

警告上記は、これらの3つの文字を含むバイナリファイルを変更します。

BOMファイルのみを表示したい場合は、次のファイルを使用します。

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

9
BOMマーカーを使用してPDFを誤って検出します。これは、最初の行だけでなくドキュメント全体を検索するためです
Olivier Refalo

1
またはACKを持つ: "ACK '\のXeF \ XBB \ XBF'"
SMAR

5
先頭の「s」の前に1を追加するようにsedコマンドを変更して、最初の行にのみ適用されるようにします
Ben Combee

27
grep -rlI $'\xEF\xBB\xBF' .バイナリファイルを無視するために使用します。
dbernard

1
既に述べたように、JPGおよびその他のバイナリファイルを検出して変更します。
Jehy 2014年

41

Windowsでこれを行う最も簡単な方法:

Total Commander →プロジェクトのルートディレクトリに移動→ファイルを検索(Alt+ F7)→ファイルタイプ*。*→テキスト「EF BB BF」を検索→「16進数」チェックボックスをオン→検索

そして、あなたはリストを取得します:)


4
特に、長年愛用しているTotal Commanderを使用するのは素晴らしいですが、残念ながら他の多くの人と同じ問題が発生します。ファイル内のすべてのバイトを検索するため、多くの画像などが報告されます。これは、Hexの代わりにRegExを使用して「^ \ xEF \ xBB \ xBF」を検索することでわずかに改善できます。これにより、多くの画像が削除されますが、ファイルの途中にBOMがあるファイルがあります(ただし、数は少ないはずです)。もちろんASCII改行文字コードがBOMのすぐ後ろにあるバイナリファイル。それでも、テスト検索ですべての画像が失われました。
レゴラス

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

上記のソリューションのほとんどは、ファイルの最初の行よりも多くをテストします(たとえマーカスのソリューションなど)でも、結果をフィルターに掛けます。このソリューションでは、各ファイルの最初の行のみをテストするので、少し速くなるはずです。


1
GotはLinux(RHEL6)で次のように動作していますfind . -type f -print0 | xargs -0 awk '/^\xEF\xBB\xBF/ {print FILENAME} {nextfile}'
Olivier Refalo

これらのファイルが見つかった後にそれらを修正するために、コードをどのように変更する必要がありますか?
ブラック

7

いくつかの誤検知を受け入れる場合(非テキストファイルが存在する場合、または万が一ファイルの中央にZWNBSPがある場合)、grepを使用できます。

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

5

私は次のようなものを使用します:

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

これにより、BOMがファイルの最初のバイトから始まるようになります。


5

あなたはgrepそれらを見つけるために使用し、Perlはそれらを次のように取り除くことができます:

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

これは私にとってはうまくいきましたが、受け入れられた答えはうまくいきませんでした(私はMacを
使っ

4

Windowsユーザーの場合、これを参照BOMしてください(プロジェクトでを見つけるための適切なPHPスクリプト)。


リンクされたWebサイトには、「オフラインのWebサイト、キャッシュされたバージョンはありません」と表示されます。
ヴォグ

同じスクリプトがgithubでも利用可能です:github.com/emrahgunduz/BomCleaner
emrahgunduz

ありがとうバディ、あなたの答えは私の日を救った。
Krunal Panchal

そしてBOMファインダー:github.com/svn2github/wikia/blob/master/extensions/FCKeditor/… (誰かが「自動」クリーニングを好まない場合、または単にBOMでファイルを検索したい場合)
meloniq

3

これに対する過剰な解決策はphptagsvi同じ名前のツールではなく)あり、特にPHPスクリプトを探します。

phptags --warn ./

次のようなものを出力します:

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

そして、--whitespaceモードはそのような問題を自動的に修正します(再帰的ですが、それは.phpスクリプトのみを書き換えると断言します。)


2
find -type f -print0 | xargs -0 grep -l `printf '^\xef\xbb\xbf'` | sed 's/^/found BOM in: /'
  • find -print0 改行を使用する代わりに、各ファイル名の間にヌル\ 0を挿入します
  • xargs -0 行区切りではなく、null区切りの引数が必要です
  • grep -l 正規表現に一致するファイルをリストします
  • 正規表現^\xeff\xbb\xbfは完全に正しいわけではありません。行頭にゼロのスペースがある場合、BOMされていないUTF-8ファイルと一致します。

まだgrepの前にパイプの「ヘッド1」が必要です
MSalters

2

これを使用してJavaScriptファイルのみを修正しました。

find . -iname *.js -type f -exec sed 's/^\xEF\xBB\xBF//' -i.bak {} \; -exec rm {}.bak \;

0

UTFファイルを探している場合は、fileコマンドが機能します。ファイルのエンコーディングが何であるかを教えてくれます。そこに非ASCII文字がある場合は、UTFになります。

file *.php | grep UTF

ただし、これは再帰的に機能しません。あなたはおそらくそれを再帰的にするためにいくつかの豪華なコマンドをリギングすることができますが、私はレベルを使い果たすまで、以下のように各レベルを個別に検索しました。

file */*.php | grep UTF
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.