web-dev-qa-db-ja.com

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

デバッグのために、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

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

より短いまたはよりエレガントなソリューションはありますか?

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

88
vog

厄介なBOMを見つけるだけでなくクリアするこの1つの単純なコマンドについてはどうでしょうか。 :)

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

「見つける」が大好きです:)

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

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

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

Windowsでこれを行うための最良かつ最も簡単な方法:

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

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

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

上記のソリューションのほとんどは、たとえファイル(Marcusのソリューションなど)が結果をフィルタリングしたとしても、ファイルの最初の行よりも多くテストします。このソリューションでは、各ファイルの最初の行のみをテストするため、少し速くする必要があります。

13
Aron Griffis

いくつかの誤検知を受け入れた場合(非テキストファイルがある場合、またはありそうもない場合にファイルの途中にZWNBSPがある場合)、grepを使用できます。

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

grepを使用してそれらを見つけ、Perlを使用してそれらを削除できます。

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

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

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

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

5
Marcus Griep

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

4
julien

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

phptags --warn ./

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

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

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

3
mario

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

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は、改行を使用する代わりに、各ファイル名の間にヌル\ 0を挿入します
  • xargs -0は、行で区切られた引数ではなく、nullで区切られた引数を期待します
  • grep -lは、正規表現に一致するファイルをリストします
  • 正規表現^\xeff\xbb\xbfは、行の先頭にゼロ幅のスペースがある場合、非BOM形式のUTF-8ファイルと一致するため、完全に正しいわけではありません。
2
Jonathan Wright

UTFファイルを探している場合は、 fileコマンド が機能します。ファイルのエンコーディングが何であるかがわかります。 ASCII以外の文字が含まれている場合、UTFが使用されます。

file *.php | grep UTF

しかし、それは再帰的に機能しません。おそらく、それを再帰的にするためにいくつかの派手なコマンドを作成できますが、レベルがなくなるまで、次のように各レベルを個別に検索しました。

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