100

デバッグの目的で、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

改行を含むファイル名では機能しませんが、そのようなファイルは想定されていません。

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

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

4

11 に答える 11

178

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

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

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

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

BOMファイルだけを表示したい場合は、次のファイルを使用してください。

grep -rl $'\xEF\xBB\xBF' .
于 2010-05-18T15:37:42.487 に答える
42

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

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

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

于 2011-09-19T23:06:44.257 に答える
13
find . -type f -print0 | xargs -0r awk '
    /^\xEF\xBB\xBF/ {print FILENAME}
    {nextfile}'

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

于 2010-05-21T19:22:13.180 に答える
8

いくつかの誤検知を受け入れる場合 (テキスト以外のファイルがある場合、またはファイルの途中に ZWNBSP がある可能性が低い場合)、grep を使用できます。

fgrep -rl `echo -ne '\xef\xbb\xbf'` .
于 2008-10-17T11:55:14.777 に答える
6

を使用grepしてそれらを見つけ、Perl を使用してそれらを次のように取り除くことができます。

grep -rl $'\xEF\xBB\xBF' . | xargs perl -i -pe 's{\xEF\xBB\xBF}{}'
于 2013-07-12T21:16:51.320 に答える
5

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

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

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

于 2008-10-17T14:12:25.950 に答える
4

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

于 2011-11-03T09:34:05.607 に答える
3

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

find . -iname *.js -type f -exec sed 's/^\xEF\xBB\xBF//' -i.bak {} \; -exec rm {}.bak \;
于 2012-04-03T09:05:19.713 に答える
3

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

phptags --warn ./

次のような出力が得られます:

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

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

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

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

file *.php | grep UTF

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

file */*.php | grep UTF
于 2014-10-16T14:28:10.630 に答える