出于调试目的,我需要以递归方式在目录中搜索以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
它不适用于包含换行符的文件名,但无论如何都不会出现这样的文件.
是否有更短或更优雅的解决方案?
文本编辑器是否有任何有趣的文本编辑器或宏?
这一个简单的命令怎么样,但不仅仅是找到但是清除讨厌的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}{}'