用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