BOM으로 UTF-8 파일을 검색하는 우아한 방법?


94

디버깅을 위해 UTF-8 BOM (byte order mark)으로 시작하는 모든 파일에 대한 디렉토리를 재귀 적으로 검색해야합니다. 내 현재 솔루션은 간단한 쉘 스크립트입니다.

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

줄 바꿈이 포함 된 파일 이름에서는 작동하지 않지만 이러한 파일은 어쨌든 예상되지 않습니다.

더 짧거나 더 우아한 솔루션이 있습니까?

텍스트 편집기를위한 흥미로운 텍스트 편집기 나 매크로가 있습니까?

답변:


166

불쾌한 BOM을 찾을뿐만 아니라 지우는이 간단한 명령은 어떻습니까? :)

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

나는 "찾기"를 좋아한다 :)

경고 위의 내용은 이러한 세 문자를 포함하는 바이너리 파일을 수정 합니다.

BOM 파일 만 표시하려면 다음을 사용하십시오.

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

9
BOM 마커가있는 PDF를 잘못 감지합니다. 이는 첫 번째
줄뿐

1
또는 ack 사용 : "ack '\ xEF \ xBB \ xBF'"
Smar

5
선두의 '가 첫 번째 라인에 적용되도록하기 전에 하나를 추가 할 나오지 명령을 변경
벤 Combee

27
grep -rlI $'\xEF\xBB\xBF' .바이너리 파일을 무시하는 데 사용 합니다.
dbernard 2012

1
이미 말했듯이 JPG 및 기타 이진 파일을 감지하고 수정합니다.
Jehy 2014-01-28

41

Windows에서이 작업을 수행하는 가장 쉽고 쉬운 방법 :

Total Commander → 프로젝트의 루트 디렉토리로 이동 → 파일 찾기 ( Alt+ F7) → 파일 형식 *. * → 텍스트 "EF BB BF"찾기 → 'Hex'체크 박스 확인 → 검색

그리고 당신은 목록을 얻습니다 :)


4
특히 오랫동안 좋아하는 Total 사령관을 사용하는 것이 좋지만 불행히도 다른 많은 사람들과 동일한 문제가 발생합니다. fle의 모든 바이트를 검색하므로 많은 이미지 등이보고됩니다. Hex 대신 RegEx를 사용하고 "^ \ xEF \ xBB \ xBF"를 검색하면 약간 개선 될 수 있습니다. 이렇게하면 많은 이미지가 제거되지만 파일 중간에 BOM이있는 파일이 있습니다 (물론 적어야 함). ascii 개행 문자 코드가있는 바이너리 파일은 BOM에 속합니다. 그래도 모든 이미지가 테스트 검색에서 사라졌습니다.
Legolas 2015 년

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

위에 제공된 대부분의 솔루션은 일부 (예 : Marcus의 솔루션)가 결과를 필터링하더라도 파일의 첫 번째 줄보다 더 많이 테스트합니다. 이 솔루션은 각 파일의 첫 번째 줄만 테스트하므로 조금 더 빠릅니다.


1
당함 리눅스 (RHEL6)에서 다음과 협력 -find . -type f -print0 | xargs -0 awk '/^\xEF\xBB\xBF/ {print FILENAME} {nextfile}'
올리비에 Refalo

이러한 파일을 찾은 후 수정하려면 코드를 어떻게 수정해야합니까?
Black

7

오 탐지 (텍스트가 아닌 파일이있는 경우 또는 파일 중간에 ZWNBSP가있는 경우)를 허용하는 경우 grep을 사용할 수 있습니다.

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

5

다음과 같이 사용합니다.

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

그러면 BOM이 파일의 첫 번째 바이트에서 시작됩니다.


5

grep이를 사용 하여 찾을 수 있으며 Perl을 사용 하여 다음과 같이 제거 할 수 있습니다.

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

나를 위해 일한이 하나, 허용 대답은 (내가 맥에있어)하지 않았다
mjsarfatti

4

Windows 사용자의 경우이 항목을 참조 하십시오 ( BOM프로젝트에서 찾기에 좋은 PHP 스크립트 ).


링크 된 웹 사이트에는 "웹 사이트 오프라인, 사용 가능한 캐시 된 버전 없음"이 표시됩니다.
vog

같은 스크립트는 GitHub의 형태로도 주문 가능합니다 github.com/emrahgunduz/BomCleaner
emrahgunduz

고마워 친구, 당신의 대답은 내 하루를 구했습니다.
Krunal Panchal

그리고 BOM 찾기 : github.com/svn2github/wikia/blob/master/extensions/FCKeditor/... (경우 누군가에가 아니라 '자동'청소처럼 수행하거나 BOM을 가진 파일을 찾을 싶어)
meloniq을

3

이에 대한 과잉 해결책은 phptags( vi동일한 이름 의 도구가 아님 ) 특히 PHP 스크립트를 찾습니다.

phptags --warn ./

다음과 같이 출력됩니다.

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

그리고 --whitespace모드는 이러한 문제를 자동으로 수정합니다 (재귀 적으로하지만 .php 스크립트 만 다시 작성한다고 주장합니다).


2
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 정규식과 일치하는 파일을 나열합니다.
  • ^\xeff\xbb\xbf줄의 시작 부분에 너비가 0 인 경우 BOM이 아닌 UTF-8 파일과 일치하므로 정규식 은 완전히 정확하지 않습니다.

grep 이전에 파이프에 "헤드 1"이 여전히 필요합니다.
MSalters

2

JavaScript 파일 만 수정하는 데 사용했습니다.

find . -iname *.js -type f -exec sed 's/^\xEF\xBB\xBF//' -i.bak {} \; -exec rm {}.bak \;

0

UTF 파일을 찾고 있다면 file 명령이 작동합니다. 파일의 인코딩이 무엇인지 알려줍니다. ASCII가 아닌 문자가 있으면 UTF로 표시됩니다.

file *.php | grep UTF

그래도 재귀 적으로 작동하지 않습니다. 재귀 적으로 만들기 위해 멋진 명령을 만들 수 있지만 레벨이 다 떨어질 때까지 다음과 같이 각 레벨을 개별적으로 검색했습니다.

file */*.php | grep UTF
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.