如何解压扩展名为 .tar.gz.aa、.tar.gz.ab..... windows 的多个文件?

How to untar multiple files with an extension .tar.gz.aa, .tar.gz.ab..... in windows?

如何解压扩展名为 .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
cat *.tar.gz.* | zcat | tar xvf -
zcat : The term 'zcat' is not recognized as the name of a cmdlet, function, script file, or operable program. Check
the spelling of the name, or if a path was included, verify that the path is correct and try again.
At line:1 char:18
+ cat *.tar.gz.* | zcat | tar xvf -
+                  ~~~~
    + CategoryInfo          : ObjectNotFound: (zcat:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

提前致谢!如果其他人可能面临同样的困难,也很高兴知道 linux 的任何解决方案。

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