Как пакетно обрезать файл по заданному количеству байтов?

У меня есть ~300 файлов, которые должны быть усечены (мне нужно удалить указанное количество байтов из начала файла). Я могу сделать это один за другим, используя редактор шестнадцатеричных файлов, но учитывая количество файлов, которые мне нужно обработать, это было бы довольно сложной задачей.

Есть ли автоматизированное решение для этого? (Операционная система Windows 7 64bit.)

3 ответа

dd имеет возможность пропустить.

За файл Вы можете использовать dd if=MyFile of=my_new_file skip=BytesToSkip

Необязательно в цикле (например, в bash в целевой директории)
for a in * ; do echo processing $a ; dd if=$a of=$a.shorter skip=300 ; done

Настройте пропуск с правильным количеством байтов, КБ или МБ
Если файлы большие, воспроизведение с размером блока (bs=X) может ускорить процесс.

Ну вот...

Код Powershell:

$PATH = "d:\My Dir"
$BYTES_TO_TRIM = 10

$files = dir $PATH | where { !$_.PsIsContainer }

foreach ($file in $files) {
    Write-Output "File being truncated: $($file.FullName)"
    Write-Output "  Original Size: $($file.Length) bytes"
    Write-Output "  Truncating $BYTES_TO_TRIM bytes..."
    $byteEncodedContent = [System.IO.File]::ReadAllBytes($file.FullName)
    $truncatedByteEncodedContent = $byteEncodedContent[$BYTES_TO_TRIM..($byteEncodedContent.Length - 1)]
    Set-Content -value $truncatedByteEncodedContent -encoding byte -path "$($file.FullName)"

    Write-Output "  Size after truncation: $((Get-Item $file.FullName).Length) bytes"
    Write-Output "Truncation done!`n"
}

Без загрузки всего файла в память:
например. удалите 3 ведущих байта из всех файлов журналов и сохраните копию в1_<same name>:

      set files=*.log
set bytes=3
for %i in (%files%) do set /a size=%~zi-%bytes% >nul & powershell gc "%i" -Encoding byte -Tail !size! ^| sc 1_"%i" -Encoding byte

Протестировано в Win 10 cmd.

Другие вопросы по тегам