使用BOM搜索UTF-8文件的优雅方式?

时间:2008-10-15 13:48:29

标签: php utf-8 shell text-editor

出于调试目的,我需要以递归方式在目录中搜索以UTF-8字节顺序标记(BOM)开头的所有文件。我目前的解决方案是一个简单的shell脚本:

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

它不适用于包含换行符的文件名, 但无论如何都不会有这样的文件。

是否有更短或更优雅的解决方案?

文本编辑器是否有任何有趣的文本编辑器或宏?

11 个答案:

答案 0 :(得分:154)

这个简单的命令怎么样,但不仅仅是找到但是清除讨厌的BOM? :)

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

我爱“找”:)

警告以上修改包含这三个字符的二进制文件。

如果您只想显示BOM文件,请使用以下文件:

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

答案 1 :(得分:38)

在Windows上执行此操作的最佳和最简单的方法:

Total Commander→转到项目的根目录→查找文件( Alt + F7 )→文件类型*。*→查找文本“EF BB BF” →选中'Hex'复选框→搜索

你得到清单:)

答案 2 :(得分:12)

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

上面给出的大多数解决方案都比文件的第一行测试更多,即使一些(例如Marcus的解决方案)然后过滤结果。此解决方案仅测试每个文件的第一行,因此它应该更快一些。

答案 3 :(得分:7)

如果您接受一些误报(如果有非文本文件,或者在不太可能的情况下文件中间有ZWNBSP),您可以使用grep:

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

答案 4 :(得分:5)

我会使用类似的东西:

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

这将确保从文件的第一个字节开始发生BOM。

答案 5 :(得分:5)

您可以使用grep找到它们,使用Perl将它们剥离出来:

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

答案 6 :(得分:4)

对于Windows用户,请参阅this(用于在项目中查找BOM的优秀PHP脚本)。

答案 7 :(得分:3)

对此的过度解决方案是phptags(不是具有相同名称的vi工具),它专门查找PHP脚本:

phptags --warn ./

将输出如下内容:

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

--whitespace模式将自动修复此类问题(递归,但断言它只重写.php脚本。)

答案 8 :(得分: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文件,如果它们在行的开头没有宽度空格

答案 9 :(得分:2)

我用它来纠正JavaScript文件:

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

答案 10 :(得分:0)

如果您要查找UTF文件,file command可以正常工作。它会告诉你文件的编码是什么。如果那里有任何非ASCII字符,它将提供UTF。

file *.php | grep UTF

虽然不会递归地工作。您可能可以使用一些奇特的命令来使其递归,但我只是像下面那样单独搜索每个级别,直到我用完了级别。

file */*.php | grep UTF