代码之家  ›  专栏  ›  技术社区  ›  vog

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

  •  83
  • vog  · 技术社区  · 16 年前

    为了调试的目的,我需要递归地在目录中搜索以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 回复  |  直到 7 年前
        1
  •  152
  •   oxygen    7 年前

    这一个简单的命令,它不仅查找,而且清除讨厌的bom呢?:)

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

    我喜欢“查找”:)

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

    .

    如果只想显示物料清单文件,请使用此文件:

    grep -rl $'\xEF\xBB\xBF' .
    
        2
  •  36
  •   doppelgreener Perry Tew    8 年前

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

    Total Commander →转到项目的根目录→查找文件( 中高音 + F7 )→文件类型*.*→查找文本“ef bb bf”→选中“hex”复选框→搜索

    然后你得到名单:)

        3
  •  12
  •   Aron Griffis    15 年前
    find . -type f -print0 | xargs -0r awk '
        /^\xEF\xBB\xBF/ {print FILENAME}
        {nextfile}'
    

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

        4
  •  7
  •   CesarB    16 年前

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

    fgrep -rl `echo -ne '\xef\xbb\xbf'` .
    
        5
  •  5
  •   Marcus Griep    16 年前

    我会使用类似的东西:

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

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

        6
  •  5
  •   theory    12 年前

    你可以使用 grep 要找到它们,请使用Perl将它们剥离出来,如下所示:

    grep -rl $'\xEF\xBB\xBF' . | xargs perl -i -pe 's{\xEF\xBB\xBF}{}'
    
        7
  •  4
  •   Peter Mortensen icecrime    10 年前

    对于Windows用户,请参见 this (用于查找 BOM 在你的项目中)。

        8
  •  3
  •   mario    13 年前

    解决这个问题的方法是 phptags (不是) vi 具有相同名称的工具),它专门查找PHP脚本:

    phptags --warn ./
    

    将输出如下内容:

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

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

        9
  •  2
  •   Jonathan Wright    16 年前
    find -type f -print0 | xargs -0 grep -l `printf '^\xef\xbb\xbf'` | sed 's/^/found BOM in: /'
    
    • find -print0 在每个文件名之间放置一个空值\0,而不是使用新行
    • xargs -0 应为空分隔参数,而不是行分隔参数
    • grep -l 列出与regex匹配的文件
    • 正则表达式 ^\xeff\xbb\xbf 不完全正确,因为如果行的开头有零宽度的空格,它将匹配非bomed utf-8文件
        10
  •  2
  •   Peter Mortensen icecrime    10 年前

    我使用它只更正javascript文件:

    find . -iname *.js -type f -exec sed 's/^\xEF\xBB\xBF//' -i.bak {} \; -exec rm {}.bak \;
    
        11
  •  0
  •   Mike Dotterer    10 年前

    如果要查找utf文件,请 file command 作品。它将告诉您文件的编码是什么。如果其中有任何非ASCII字符,则会出现UTF。

    file *.php | grep UTF
    

    但这不会递归地工作。您可能可以装配一些花哨的命令使其递归,但我只是像下面那样逐个搜索每个级别,直到用完级别为止。

    file */*.php | grep UTF