如何解压缩扩展名为.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的任何解决方案。
2条答案
按热度按时间i2byvkas1#
您正在调用
cat
(Get-Content
的别名)来枚举单个文件的内容,然后尝试将解析后的文件内容传递给tar
。你得到的OutOfMemoryException
由于这个。Get-Content
不是设计用来读取二进制文件的,它是设计用来读取ASCII和Unicode文本文件的,当然也不是10GB的。即使你有可用的内存,我也不知道Get-Content
处理这么大的单个文件的性能如何。只需像这样将文件路径传递给
tar
,添加任何您需要的额外参数,例如控制输出目录等:字符串
您可以通过一个循环一次性提取所有归档文件(使用一些有用的输出和结果检查)。此代码在PowerShell Core中也是100%可执行的,并且应该在Linux上工作:
型
让我们来分解一下:
$pathToFolderWithGzips
应该设置为包含tarball的目录的完整路径。Push-Location
的工作方式与cd
类似,但使用位置堆栈。您可以使用Pop-Location
返回到以前的目录。我们将目录更改为要将文件解压缩到的位置。cd -
和cd +
try
块中,以便在try
完成后返回到上一个文件夹位置。( Get-ChildItem -File *.tar.gz.a[a-n] ).FullName
枚举当前目录中与globbing模式匹配的所有文件,但要确保最后一个字母是a
到n
之一。访问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-Location
、try
和finally
位,只运行当前try
块内部的内容,适当修改tar
命令。您还需要将前缀*.tar.gz.a[a-n]
与$pathToFolderWithGzips
(例如$pathToFolderWithGzips\*.tar.gz.a[a-n]
)也是如此。9rbhqvlz2#
这些文件是用tar和GNU split coreutil创建的,不是独立的tar归档文件。
例如,在Linux上,这创建了
tarball.tar.gz.aa
等。字符串
若要在PowerShell 6或更高版本中加入这些二进制文件:
型
对于大文件,调整ReadCount以复制不同大小的块中的字节
然后按预期使用tar
型