デバッグのために、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
改行を含むファイル名では機能しませんが、そのようなファイルはとにかく期待されていません。
より短いまたはよりエレガントなソリューションはありますか?
興味深いテキストエディターやテキストエディター用のマクロはありますか?
厄介なBOMを見つけるだけでなくクリアするこの1つの単純なコマンドについてはどうでしょうか。 :)
find . -type f -exec sed '1s/^\xEF\xBB\xBF//' -i {} \;
「見つける」が大好きです:)
警告上記は変更これらの3文字を含むバイナリファイルです。
。
BOMファイルのみを表示する場合は、次のファイルを使用します。
grep -rl $'\xEF\xBB\xBF' .
Windowsでこれを行うための最良かつ最も簡単な方法:
Total Commander →プロジェクトのルートディレクトリに移動→ファイルを検索(Alt + F7)→ファイルタイプ*。*→「EF BB BF」というテキストを検索→「Hex」チェックボックスをチェック→検索
そして、あなたはリストを取得します:)
find . -type f -print0 | xargs -0r awk '
/^\xEF\xBB\xBF/ {print FILENAME}
{nextfile}'
上記のソリューションのほとんどは、たとえファイル(Marcusのソリューションなど)が結果をフィルタリングしたとしても、ファイルの最初の行よりも多くテストします。このソリューションでは、各ファイルの最初の行のみをテストするため、少し速くする必要があります。
いくつかの誤検知を受け入れた場合(非テキストファイルがある場合、またはありそうもない場合にファイルの途中にZWNBSPがある場合)、grepを使用できます。
fgrep -rl `echo -ne '\xef\xbb\xbf'` .
grep
を使用してそれらを見つけ、Perlを使用してそれらを削除できます。
grep -rl $'\xEF\xBB\xBF' . | xargs Perl -i -pe 's{\xEF\xBB\xBF}{}'
私は次のようなものを使用します:
grep -orHbm1 "^`echo -ne '\xef\xbb\xbf'`" . | sed '/:0:/!d;s/:0:.*//'
これにより、ファイルの最初のバイトからBOMが発生するようになります。
Windowsユーザーの場合、 this (good PHPプロジェクトでBOM
を見つけるためのスクリプト)を参照してください。
これに対する過剰な解決策は phptags
(同じ名前のvi
ツールではありません)で、特にPHPスクリプトを探します:
phptags --warn ./
次のようなものを出力します:
./invalid.php: TRAILING whitespace ("?>\n")
./invalid.php: UTF-8 BOM alone ("\xEF\xBB\xBF")
そしてその --whitespace
モードは、このような問題を自動的に修正します(再帰的に、ただし.phpスクリプトのみを書き換えると断言します)。
これを使用して、JavaScriptファイルのみを修正しました。
find . -iname *.js -type f -exec sed 's/^\xEF\xBB\xBF//' -i.bak {} \; -exec rm {}.bak \;
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ファイルと一致するため、完全に正しいわけではありません。UTFファイルを探している場合は、 fileコマンド が機能します。ファイルのエンコーディングが何であるかがわかります。 ASCII以外の文字が含まれている場合、UTFが使用されます。
file *.php | grep UTF
しかし、それは再帰的に機能しません。おそらく、それを再帰的にするためにいくつかの派手なコマンドを作成できますが、レベルがなくなるまで、次のように各レベルを個別に検索しました。
file */*.php | grep UTF