문제

디버깅 목적으로 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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top