出于调试目的,我需要以递归方式在目录中搜索以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
它不适用于包含换行符的文件名, 但无论如何都不会有这样的文件。
是否有更短或更优雅的解决方案?
文本编辑器是否有任何有趣的文本编辑器或宏?
答案 0 :(得分:154)
这个简单的命令怎么样,但不仅仅是找到但是清除讨厌的BOM? :)
find . -type f -exec sed '1s/^\xEF\xBB\xBF//' -i {} \;
我爱“找”:)
警告以上修改包含这三个字符的二进制文件。
如果您只想显示BOM文件,请使用以下文件:
grep -rl $'\xEF\xBB\xBF' .
答案 1 :(得分:38)
在Windows上执行此操作的最佳和最简单的方法:
Total Commander→转到项目的根目录→查找文件( Alt + F7 )→文件类型*。*→查找文本“EF BB BF” →选中'Hex'复选框→搜索
你得到清单:)
答案 2 :(得分:12)
find . -type f -print0 | xargs -0r awk '
/^\xEF\xBB\xBF/ {print FILENAME}
{nextfile}'
上面给出的大多数解决方案都比文件的第一行测试更多,即使一些(例如Marcus的解决方案)然后过滤结果。此解决方案仅测试每个文件的第一行,因此它应该更快一些。
答案 3 :(得分:7)
如果您接受一些误报(如果有非文本文件,或者在不太可能的情况下文件中间有ZWNBSP),您可以使用grep:
fgrep -rl `echo -ne '\xef\xbb\xbf'` .
答案 4 :(得分:5)
我会使用类似的东西:
grep -orHbm1 "^`echo -ne '\xef\xbb\xbf'`" . | sed '/:0:/!d;s/:0:.*//'
这将确保从文件的第一个字节开始发生BOM。
答案 5 :(得分:5)
您可以使用grep
找到它们,使用Perl将它们剥离出来:
grep -rl $'\xEF\xBB\xBF' . | xargs perl -i -pe 's{\xEF\xBB\xBF}{}'
答案 6 :(得分:4)
对于Windows用户,请参阅this(用于在项目中查找BOM
的优秀PHP脚本)。
答案 7 :(得分:3)
对此的过度解决方案是phptags
(不是具有相同名称的vi
工具),它专门查找PHP脚本:
phptags --warn ./
将输出如下内容:
./invalid.php: TRAILING whitespace ("?>\n")
./invalid.php: UTF-8 BOM alone ("\xEF\xBB\xBF")
--whitespace
模式将自动修复此类问题(递归,但断言它只重写.php脚本。)
答案 8 :(得分:2)
find -type f -print0 | xargs -0 grep -l `printf '^\xef\xbb\xbf'` | sed 's/^/found BOM in: /'
find -print0
在每个文件名之间放置一个null \ 0而不是使用新行xargs -0
期望以null分隔的参数而不是行分隔的grep -l
列出与正则表达式匹配的文件^\xeff\xbb\xbf
并不完全正确,因为它会匹配非BOM的UTF-8文件,如果它们在行的开头没有宽度空格答案 9 :(得分:2)
我用它来纠正JavaScript文件:
find . -iname *.js -type f -exec sed 's/^\xEF\xBB\xBF//' -i.bak {} \; -exec rm {}.bak \;
答案 10 :(得分:0)
如果您要查找UTF文件,file command可以正常工作。它会告诉你文件的编码是什么。如果那里有任何非ASCII字符,它将提供UTF。
file *.php | grep UTF
虽然不会递归地工作。您可能可以使用一些奇特的命令来使其递归,但我只是像下面那样单独搜索每个级别,直到我用完了级别。
file */*.php | grep UTF