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

vog*_*vog 89 php shell text-editor utf-8

出于调试目的,我需要以递归方式在目录中搜索以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
Run Code Online (Sandbox Code Playgroud)

或者,如果您喜欢简短,不可读的单行:

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

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

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

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

小智 161

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

find . -type f -exec sed '1s/^\xEF\xBB\xBF//' -i {} \;
Run Code Online (Sandbox Code Playgroud)

我喜欢"找到":)

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

.

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

grep -rl $'\xEF\xBB\xBF' .
Run Code Online (Sandbox Code Playgroud)

  • 使用`grep -rlI $'\ xEF\xBB\xBF'.`来忽略二进制文件. (25认同)
  • 使用BOM标记错误地检测PDF ..这是因为它搜索整个文档,而不仅仅是第一行 (8认同)
  • 更改sed命令以在前导's'之前添加1,因此它仅适用于第一行 (5认同)

小智 40

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

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

你得到了清单:)

  • 很好,尤其是使用了我长期以来最喜欢的Total指挥官,但不幸的是,这和许多其他命令一样遇到了同样的问题:它搜索文件中的所有字节,因此报告了很多图像等。通过使用RegEx而不是Hex并搜索“ ^ \ xEF \ xBB \ xBF”,可以略微改善此效果,这将消除许多图像,但仍然具有BOM处于文件中间的文件(尽管应该很少),当然在BOM表之前,恰好具有ascii换行符的任何二进制文件。尽管如此,所有图像在我的测试搜索中都消失了。 (2认同)

Aro*_*fis 13

find . -type f -print0 | xargs -0r awk '
    /^\xEF\xBB\xBF/ {print FILENAME}
    {nextfile}'
Run Code Online (Sandbox Code Playgroud)

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

  • Got 正在 Linux (RHEL6) 上使用以下内容 - `find . -type f -print0 | xargs -0 awk '/^\xEF\xBB\xBF/ {打印文件名} {下一个文件}'` (2认同)

Ces*_*arB 7

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

fgrep -rl `echo -ne '\xef\xbb\xbf'` .
Run Code Online (Sandbox Code Playgroud)


Mar*_*iep 5

我会使用类似的东西:

grep -orHbm1 "^`echo -ne '\xef\xbb\xbf'`" . | sed '/:0:/!d;s/:0:.*//'
Run Code Online (Sandbox Code Playgroud)

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


the*_*ory 5

您可以使用grep它们来查找它们和Perl来将它们剥离出来,如下所示:

grep -rl $'\xEF\xBB\xBF' . | xargs perl -i -pe 's{\xEF\xBB\xBF}{}'
Run Code Online (Sandbox Code Playgroud)