为调试目的,我需要递归搜索目录的所有文件,它开始一个UTF-8字节以标记(BOM).我目前的解决方案是一个简单的shell script:

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? :)

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

我喜欢“找到” :)

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

如果您只想显示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 -orHbm1 "^`echo -ne '\xef\xbb\xbf'`" . | sed '/:0:/!d;s/:0:.*//'

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

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

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

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

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

phptags --warn ./

将输出如下内容:

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

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

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
  • Regex ^\xeff\xbb\xbf 不完全正确的,因为它将符合非BOMed UTF-8的文件,如果他们有零宽空间,在开始一线

我用它来纠正JavaScript文件:

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

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

file *.php | grep UTF

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

file */*.php | grep UTF
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top