如何解压缩扩展名为.tar.gz.aa,.tar.gz.ab.....的多个文件,在Windows?

ca1c2owp  于 2023-08-07  发布在  Windows
关注(0)|答案(2)|浏览(303)

如何解压缩扩展名为.tar.gz.aa,.tar.gz.ab.....的多个文件。直到.tar.gz.an每个文件在Windows中大约10 GB?
我在我的powershell中尝试了以下命令(具有管理员权限):

cat <name>.tar.gz.aa | tar xzvf -

cat : Exception of type 'System.OutOfMemoryException' was thrown.
At line:1 char:1
+ cat <name>.tar.gz.aa | tar xzvf –
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Get-Content], OutOfMemoryException
    + FullyQualifiedErrorId : System.OutOfMemoryException,Microsoft.PowerShell.Commands.GetContentCommand

个字符
提前感谢!如果其他人也面临同样的困难,我也很乐意知道linux的任何解决方案。

i2byvkas

i2byvkas1#

您正在调用catGet-Content的别名)来枚举单个文件的内容,然后尝试将解析后的文件内容传递给tar。你得到的OutOfMemoryException由于这个。Get-Content不是设计用来读取二进制文件的,它是设计用来读取ASCII和Unicode文本文件的,当然也不是10GB的。即使你有可用的内存,我也不知道Get-Content处理这么大的单个文件的性能如何。
只需像这样将文件路径传递给tar,添加任何您需要的额外参数,例如控制输出目录等:

tar xvzf "$name.tar.gz.aa"

字符串
您可以通过一个循环一次性提取所有归档文件(使用一些有用的输出和结果检查)。此代码在PowerShell Core中也是100%可执行的,并且应该在Linux上工作:

Push-Location $pathToFolderWithGzips

try {
  ( Get-ChildItem -File *.tar.gz.a[a-n] ).FullName | ForEach-Object {
    Write-Host "Extracting $_"
    tar xzf $_
  
    if( $LASTEXITCODE -ne 0 ) {
      Write-Warning "tar returned $LASTEXITCODE"
    }
  }
} finally {
  Pop-Location
}


让我们来分解一下:

  • $pathToFolderWithGzips应该设置为包含tarball的目录的完整路径。
  • Push-Location的工作方式与cd类似,但使用位置堆栈。您可以使用Pop-Location返回到以前的目录。我们将目录更改为要将文件解压缩到的位置。
  • 注意:PowerShell Core支持类似POSIX的cd -cd +
  • 将其余部分 Package 在一个try块中,以便在try完成后返回到上一个文件夹位置。
  • ( Get-ChildItem -File *.tar.gz.a[a-n] ).FullName枚举当前目录中与globbing模式匹配的所有文件,但要确保最后一个字母是an之一。访问FullName属性只为我们提供了每个文件的完全限定路径,这是我们向下传递管道所需的全部内容。
  • | ForEach-Object { ... }将通过管道传输前面表达式的FullName值中的所有文件名,并在每个完全限定路径上进行迭代。
  • Write-Host通过信息流向控制台输出信息。此文本在当前PowerShell会话中无法以编程方式访问。Write-Warning进一步用于类似的效果,但在视觉上是不同的。
  • 如果您希望稍后在同一会话中处理文本,可以使用Write-Output,但通常我们希望在可能的情况下对字符串进行操作。
  • $_$PSItem的别名,$PSItem是用于管道上下文的自动变量。在ForEach-Object循环中迭代的每个文件路径都将被引用为$PSItem。我们使用此变量将归档路径传递给tar
  • $LASTEXITCODE是在最后一个可执行文件完成运行时设置的。这与$?bash中的工作方式类似(尽管不要将其与PowerShell的$?混淆)。-ne是“不等于”的运算符
  • finally在关闭try块后使用,Pop-Location返回到上一个目录。无论try代码成功还是失败,finally块始终被执行 *。
  • 我承认我不擅长使用tar可执行文件,所以如果你知道如何在不位于当前目录的情况下控制文件夹输出,你可以省略Push-Location

Pop-Locationtryfinally位,只运行当前try块内部的内容,适当修改tar命令。您还需要将前缀
*.tar.gz.a[a-n]$pathToFolderWithGzips(例如$pathToFolderWithGzips\*.tar.gz.a[a-n])也是如此。

9rbhqvlz

9rbhqvlz2#

这些文件是用tar和GNU split coreutil创建的,不是独立的tar归档文件。
例如,在Linux上,这创建了tarball.tar.gz.aa等。

tar -czf - somedir/ | split --bytes=200MB - tarball.tar.gz.

字符串
若要在PowerShell 6或更高版本中加入这些二进制文件:

Get-Content -AsByteStream -ReadCount 10000000 tarball.tar.gz.* | Set-Content -AsByteStream tarball.tar.gz


对于大文件,调整ReadCount以复制不同大小的块中的字节
然后按预期使用tar

tar -xzf tarball.tar.gz

相关问题