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

디버깅을 위해 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

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

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

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



답변

불쾌한 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}{}'


답변

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