BOM으로 UTF-8 파일을 검색하는 우아한 방법?
-
03-07-2019 - |
문제
디버깅 목적으로 UTF-8 바이트 주문 마크 (BOM)로 시작하는 모든 파일에 대한 디렉토리를 재귀 적으로 검색해야합니다. 내 현재 솔루션은 간단한 쉘 스크립트입니다.
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
라인 브레이크가 포함 된 파일 이름과는 작동하지 않지만 어쨌든 그러한 파일은 예상되지 않습니다.
짧거나 우아한 솔루션이 있습니까?
텍스트 편집기를위한 흥미로운 텍스트 편집기 또는 매크로가 있습니까?
해결책
이 단순한 명령은 어떻습니까? :)
find . -type f -exec sed '1s/^\xEF\xBB\xBF//' -i {} \;
나는 "찾기"를 좋아한다 :)
경고위의 의지 수정하다 이 세 문자를 포함하는 이진 파일.
.
BOM 파일을 표시하려면 다음을 사용하십시오.
grep -rl $'\xEF\xBB\xBF' .
다른 팁
Windows 에서이 작업을 수행하는 가장 가장 쉬운 방법 :
총 사령관 → 프로젝트의 루트 디르로 이동 → 파일 찾기 (대체 + F7) → 파일 유형 *. * → 텍스트 찾기 "ef bb bf"→ 'hex'checkbox → 검색 확인
그리고 당신은 목록을 얻습니다 :)
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 사용자의 경우 참조하십시오 이것 (찾기위한 좋은 PHP 스크립트 BOM
프로젝트에서).
이에 대한 과잉 솔루션입니다 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
새 라인을 사용하는 대신 각 파일 이름 사이에 NULL 0을 넣습니다.xargs -0
분리 된 선 대신 널 분리 된 인수를 기대합니다grep -l
Regex와 일치하는 파일을 나열합니다- 성과선
^\xeff\xbb\xbf
라인의 시작시 폭이 0이되면 보유되지 않은 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