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

6759
groovy354

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

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

5
Лучше всего использовать PowerShell. Он должен быть предварительно установлен с ОС. Сейчас я не на Windows-машине, но завтра я вернусь с ответом, если никто не придет. Вот подсказка, хотя: http://www.sans.org/windows-security/2010/02/11/powershell-byte-array-hex-convert 11 лет назад 1

2 ответа на вопрос

5
Hennes

dd has a skip option.

Per file You can use dd if=MyFile of=my_new_file skip=BytesToSkip

Optionally in a loop (e.g. in bash in the target directory)
for a in * ; do echo processing $a ; dd if=$a of=$a.shorter skip=300 ; done

Adjust skip with the correct number of bytes, KB or MB
If the files are large playing with the block size (bs=X) might speed things up.

Скажи это Windows ... :) 11 лет назад 0
Когда я начал свой ответ, тега win7 еще не было. Во всяком случае, насколько большие файлы? Достаточно мал для быстрого перехода на хост Unix? Достаточно большой, чтобы гарантировать установку дополнительных инструментов? Hennes 11 лет назад 0
`dd` также [доступен для Windows] (http://www.chrysocome.net/dd). В `CMD` цикл можно сделать так:` для% a in (*. *) Do dd if =% a of =% a.shorter skip = 300`. Ansgar Wiechers 11 лет назад 6
2

Here you go...

Powershell code:

$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" } 
Этот скрипт выдает следующую ошибку: «Возникло исключение типа« System.OutOfMemoryException »..» dtmland 10 лет назад 0
@dtmland Я не думал о файлах размером 100 ГБ, когда писал их. Если вы хотите, вы можете прийти с побайтовым решением для чтения. 10 лет назад 0