IT story

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

hot-time 2020. 9. 8. 21:58
반응형

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 스크립트 ).


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

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

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

If you are looking for UTF files, the file command works. It will tell you what the encoding of the file is. If there are any non ASCII characters in there it will come up with UTF.

file *.php | grep UTF

That won't work recursively though. You can probably rig up some fancy command to make it recursive, but I just searched each level individually like the following, until I ran out of levels.

file */*.php | grep UTF

참고URL : https://stackoverflow.com/questions/204765/elegant-way-to-search-for-utf-8-files-with-bom

반응형