我有大约 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 中测试