Renomeando várias extensões de arquivo com base em uma condição

2

Oi eu gostaria de renomear um monte de arquivos .bin em .oma com base em uma condição: os primeiros 4 bytes dos arquivos .bin devem incluir a string 'RIFF'. Se incluir algo mais, não o renomeie.

Atualmente estou usando o Windows 7 Pro. Existe algum software de automação já construído que eu possa usar?

Eu também preciso dessa automação para alterar um monte de títulos de mp3 mais tarde ...

    
por FlavorOfLife 10.09.2010 / 11:27

3 respostas

3

Você pode conseguir isso com o seguinte script para o Windows Powershell interno:

$files = get-childitem | where {$_.extension -eq '.bin'}

foreach ($f in $files)
{
    try
    {
        $reader = $f.Open([System.IO.FileMode]::Open)
        $bytes = new-object byte[] 4
        $numRead = $reader.Read($bytes, 0, $bytes.Count)
    }
    finally
    {
        if ($reader)
        {
            $reader.Dispose()
        }

        if ($numRead -eq 4)
        {
            $encoding = new-object "System.Text.ASCIIEncoding"
            if ($encoding.GetString($bytes) -eq "RIFF")
            {
                $newname = $f.Name.Replace(".bin", ".oma")
                rename-item $f -newname $newname
            }
        }
    }
}
    
por 10.09.2010 / 14:06
0

Eu não sei a solução "pronta para uso".

Talvez escrever um script simples em python ou perl ou o que você quiser seja a maneira mais simples.

    
por 10.09.2010 / 13:07
0

Tudo bem, alguém precisou postar uma solução bash.

find . -name '*.bin' -exec head -q -c 4 {} \; -exec printf ' %s' {} \; -exec printf '\n' \;  | grep RIFF | cut -d' ' -f2- | tr "\n" "
find . -name '*.bin' -exec head -q -c 4 {} \; -exec printf ' %s' {} \; -exec printf '\n' \;  | grep RIFF | cut -d' ' -f2- | tr "\n" "%pre%" | xargs -0 rename -v 's/\.bin/\.oma/'
" | xargs -0 rename -v 's/\.bin/\.oma/'

atualizações:

  1. Suporte para nomes de arquivos com espaços
  2. Percebeu que o truque de 'rev' era desnecessário se os executivos fossem reordenados, removidos.
por 10.09.2010 / 13:28