如何按设定的字节数批量截断文件?

如何按设定的字节数批量截断文件?

我有大约 300 个文件需要截断(我需要从文件开头删除指定数量的字节)。我可以使用十六进制文件编辑器逐个执行此操作,但考虑到我必须处理的文件数量,这将是一项相当繁重的任务。

有没有自动化的解决方案?(操作系统是 Windows 7 64 位。)

答案1

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

使用正确的字节数(KB 或 MB)调整跳过,
如果文件很大,则调整块大小(bs=X)可能会加快速度。

答案2

干得好...

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

不将整个文件加载到内存中:
例如从所有日志文件中删除 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 中测试

相关内容