UTF-8 BOM (바이트 순서 표시)이 포함 된 디렉토리의 모든 파일을 찾는 방법은 무엇입니까?


8

Windows에서 필자는 UTF-8 BOM이 포함 된 디렉토리의 모든 파일 찾기 (바이트 순서 표시). 어떤 도구로 어떻게 할 수 있습니까?

PowerShell 스크립트, 일부 텍스트 편집기의 고급 검색 기능 등이 될 수 있습니다.

답변:


13

다음은 PowerShell 스크립트 예제입니다. 그것은 C: 처음 3 바이트가있는 파일의 경로 0xEF, 0xBB, 0xBF.

Function ContainsBOM
{   
    return $input | where {
        $contents = [System.IO.File]::ReadAllBytes($_.FullName)
        $_.Length -gt 2 -and $contents[0] -eq 0xEF -and $contents[1] -eq 0xBB -and $contents[2] -eq 0xBF }
}

get-childitem "C:\*.*" | where {!$_.PsIsContainer } | ContainsBOM

"ReadAllBytes"가 필요한가? 어쩌면 첫 번째 바이트 몇 개를 읽는 것이 더 좋을까요?

공정한 포인트. 다음은 처음 3 바이트 만 읽는 업데이트 된 버전입니다.

Function ContainsBOM
{   
    return $input | where {
        $contents = new-object byte[] 3
        $stream = [System.IO.File]::OpenRead($_.FullName)
        $stream.Read($contents, 0, 3) | Out-Null
        $stream.Close()
        $contents[0] -eq 0xEF -and $contents[1] -eq 0xBB -and $contents[2] -eq 0xBF }
}

get-childitem "C:\*.*" | where {!$_.PsIsContainer -and $_.Length -gt 2 } | ContainsBOM

1
시원한. 마크하기 전에 "ReadAllBytes"가 필요한가? 어쩌면 첫 번째 바이트 몇 개를 읽는 것이 더 좋을까요?
Borek Bernard

@ 보릭 편집을 참조하십시오.
vcsjones

1
이것은 나의 하루를 구했다! 또한 배웠다. get-childitem -recurse 하위 디렉토리도 처리 할 수 ​​있습니다.
diynevala

위의 스크립트를 사용하여 BOM을 제거 할 수있는 방법이 있는지 궁금합니다.
tom_mai78101

2

참고로, 여기 내 소스 파일에서 UTF-8 BOM 문자를 제거하는 데 사용하는 PowerShell 스크립트가 있습니다.

$files=get-childitem -Path . -Include @("*.h","*.cpp") -Recurse
foreach ($f in $files)
{
(Get-Content $f.PSPath) | 
Foreach-Object {$_ -replace "\xEF\xBB\xBF", ""} | 
Set-Content $f.PSPath
}

방금 일부 파일에는 BOM이 있고 일부 파일은 그렇지 않은 파일 만 있습니다. 당신의 대답은 내가 다 정리할 필요가있는 것이 었습니다. 고맙습니다!
Tevya

0

권한이 제한된 엔터프라이즈 컴퓨터 (나와 같은)에서 powershell 스크립트를 실행할 수없는 경우, 다음과 같이 휴대용 메모장 ++을 사용할 수 있습니다. 파이썬 스크립트 플러그인은 다음 스크립트를 사용하여 작업을 수행합니다.

import os;
import sys;
filePathSrc="C:\\Temp\\UTF8"
for root, dirs, files in os.walk(filePathSrc):
    for fn in files:
      if fn[-4:] != '.jar' and fn[-5:] != '.ear' and fn[-4:] != '.gif' and fn[-4:] != '.jpg' and fn[-5:] != '.jpeg' and fn[-4:] != '.xls' and fn[-4:] != '.GIF' and fn[-4:] != '.JPG' and fn[-5:] != '.JPEG' and fn[-4:] != '.XLS' and fn[-4:] != '.PNG' and fn[-4:] != '.png' and fn[-4:] != '.cab' and fn[-4:] != '.CAB' and fn[-4:] != '.ico':
        notepad.open(root + "\\" + fn)
        console.write(root + "\\" + fn + "\r\n")
        notepad.runMenuCommand("Encoding", "Convert to UTF-8 without BOM")
        notepad.save()
        notepad.close()

신용은에 간다 https://pw999.wordpress.com/2013/08/19/mass-convert-a-project-to-utf-8-using-notepad/

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