用BOMsearchUTF-8文件的优雅方法?

为了进行debugging,我需要recursionsearch所有以UTF-8字节顺序标记(BOM)开头的文件。 我目前的解决scheme是一个简单的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 

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

有没有更短或更优雅的解决scheme?

文本编辑器有没有有趣的文本编辑器或macros?

那么这一个简单的命令,不只是发现,但清除讨厌的BOM呢? 🙂

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

我爱“找”:)

如果你只是想显示BOM文件,使用这个:

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

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

Total Commander →进入项目的根目录→find文件( Alt + F7 )→文件types*。*→查找文本“EF BB BF”→选中“hex”checkbox→search

你得到的名单:)

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

上面给出的大多数解决scheme都比文件的第一行testing更多,即使有些(如Marcus的解决scheme)会过滤结果。 这个解决scheme只testing每个文件的第一行,所以它应该更快一点。

如果您接受一些误报(如果存在非文本文件,或者文件中间存在​​ZWNBSP),则可以使用grep:

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

我会用像这样的东西:

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

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

你可以使用grep来find它们和Perl去除它们,如下所示:

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

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

对此的一个矫枉过正的解决scheme是phptags (不是具有相同名称的vi工具),它专门查找PHP脚本:

 phptags --warn ./ 

将输出如下所示:

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

而 – --whitespace模式将自动修复这些问题(recursion的,但断言它只会重写.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列出与正则expression式匹配的文件
  • 正则expression式^\xeff\xbb\xbf不完全正确,因为如果它们在行的开始处具有零宽度空格,它将匹配非BOMF的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 

这不会recursion地工作。 你或许可以制作一些奇特的命令来recursion,但是我只是像下面一样单独search每个级别,直到我用完了级别。

 file */*.php | grep UTF