Como encontrar todos os arquivos no diretório que contêm BOM UTF-8 (marca de ordem de byte)?

Como encontrar todos os arquivos no diretório que contêm BOM UTF-8 (marca de ordem de byte)?

No Windows, precisoencontre todos os arquivos em um diretório que contenha BOM UTF-8(marca de ordem de byte). Qual ferramenta pode fazer isso e como?

Pode ser um script do PowerShell, algum recurso de pesquisa avançada de editor de texto ou qualquer outra coisa.

Responder1

Aqui está um exemplo de script do PowerShell. Ele procura no C:caminho quaisquer arquivos onde estejam os primeiros 3 bytes 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

É necessário "ReadAllBytes"? Talvez a leitura de apenas alguns primeiros bytes tivesse um desempenho melhor?

Ponto justo. Aqui está uma versão atualizada que lê apenas os primeiros 3 bytes.

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

Responder2

Como observação lateral, aqui está um script do PowerShell que uso para remover os caracteres UTF-8 BOM dos meus arquivos de origem:

$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
}

Responder3

Se você estiver em um computador corporativo (como eu) com privilégios restritos e não puder executar o script PowerShell, poderá usar um Notepad ++ portátil comPythonScriptplugin para realizar a tarefa, com o seguinte script:

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()

O crédito vai parahttps://pw999.wordpress.com/2013/08/19/mass-convert-a-project-to-utf-8-using-notepad/

Responder4

Powershell testando os primeiros dois bytes. O lado direito de operadores como -eq torna-se uma string.

dir -file | 
% { $utf8bom = '239 187' -eq (get-content $_.fullname -AsByteStream)[0..1]
    [pscustomobject]@{name=$_.name; utf8bom=$utf8bom} }

name        utf8bom
----        -------
foo           False
script.ps1     True
script.ps1~   False

informação relacionada