如何解压扩展名为 .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 的任何解决方案。
您正在调用 cat
(Get-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
应设置为包含您的压缩包的目录的完整路径。
Push-Location
与 cd
类似,但使用位置堆栈。您可以 return 使用 Pop-Location
到以前的目录。我们将目录更改为我们要将文件提取到的位置。
- 注意:PowerShell Core 支持 POSIX-like
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
,但通常我们希望在 objects 上操作字符串,如果我们可以。
$_
是$PSItem
的别名,是用于管道上下文的自动变量。 ForEach-Object
循环中遍历的每个文件路径都将被引用为 $PSItem
。我们使用此变量将存档路径传递给 tar
。
$LASTEXITCODE
在最后一个可执行文件完成 运行ning 时设置。这与 $?
在 bash
中的工作方式类似(但不要将其与 PowerShell 的 $?
混淆)。 -ne
是“不等于”的运算符
finally
关闭try
块后使用Pop-Location
回到上一级目录。 finally
代码块始终执行 * 无论 try
代码是成功还是失败。
- 我承认我不擅长
tar
可执行文件所以如果你知道如何在不在当前目录下控制文件夹输出,你可以省略 Push-Location
,
Pop-Location
、try
和 finally
位以及 运行 当前 try
块中的内容,适当修改 tar
命令。在这种情况下,您还需要在
*.tar.gz.a[a-n]
前加上 $pathToFolderWithGzips
(例如 $pathToFolderWithGzips\*.tar.gz.a[a-n]
)。
如何解压扩展名为 .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 的任何解决方案。
您正在调用 cat
(Get-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
应设置为包含您的压缩包的目录的完整路径。Push-Location
与cd
类似,但使用位置堆栈。您可以 return 使用Pop-Location
到以前的目录。我们将目录更改为我们要将文件提取到的位置。- 注意:PowerShell Core 支持 POSIX-like
cd -
和cd +
- 注意:PowerShell Core 支持 POSIX-like
- 将其余部分包装在
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
,但通常我们希望在 objects 上操作字符串,如果我们可以。
- 如果您确实希望稍后在同一会话中处理文本,请改用
$_
是$PSItem
的别名,是用于管道上下文的自动变量。ForEach-Object
循环中遍历的每个文件路径都将被引用为$PSItem
。我们使用此变量将存档路径传递给tar
。$LASTEXITCODE
在最后一个可执行文件完成 运行ning 时设置。这与$?
在bash
中的工作方式类似(但不要将其与 PowerShell 的$?
混淆)。-ne
是“不等于”的运算符finally
关闭try
块后使用Pop-Location
回到上一级目录。finally
代码块始终执行 * 无论try
代码是成功还是失败。- 我承认我不擅长
tar
可执行文件所以如果你知道如何在不在当前目录下控制文件夹输出,你可以省略Push-Location
,
Pop-Location
、try
和finally
位以及 运行 当前try
块中的内容,适当修改tar
命令。在这种情况下,您还需要在*.tar.gz.a[a-n]
前加上$pathToFolderWithGzips
(例如$pathToFolderWithGzips\*.tar.gz.a[a-n]
)。
- 我承认我不擅长