![如何使用 7zip 命令行版本递归提取压缩在 .tgz 文件中的所有 .tar 和 .tgz 文件](https://linux22.com/image/1305428/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%207zip%20%E5%91%BD%E4%BB%A4%E8%A1%8C%E7%89%88%E6%9C%AC%E9%80%92%E5%BD%92%E6%8F%90%E5%8F%96%E5%8E%8B%E7%BC%A9%E5%9C%A8%20.tgz%20%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E6%89%80%E6%9C%89%20.tar%20%E5%92%8C%20.tgz%20%E6%96%87%E4%BB%B6.png)
我在我的应用程序中使用 7zip cmd 行版本(在 Win 7 机器上用 Python 编写)来提取 .tgz 文件。虽然我使用了 -r 开关,但 .tar 和 .tgz 子目录并未提取。有人能告诉我我是否忽略了什么或给我一些指导吗...谢谢!以下是我迄今为止尝试过的命令的变体:
C:> 7za e c:\Extracted\name.tgz -oc:\PathFolder *.tar -r
答案1
这里是可以执行您想要的操作的代码(注意:它保留了所有目录结构。如果您不想要这样,请将其更改为x
。e
在 powershell 中运行它)
$cont=true
cd c:\Extracted
$TarFilesToExtract = get-childItem *.tar -Recurse
$TgzFilesToExtract = get-childItem *.tgz -Recurse
foreach($file in $TarfilesToExtract)
{
7z x $file -oC:\Pathfolder
}
foreach($file in $TgzFilesToExtract)
{
7z x $file -oC:\Pathfolder
}
cd c:\Pathfolder
while($cont -eq "true")
{
$TarFilesToExtract = get-childItem *.tar -Recurse
$TgzFilesToExtract = get-childItem *.tgz -Recurse
if($TarFilesToExtract.Length -eq 0 -and $TgzFilesToExtract -eq 0)
{
$cont = "False"
}
else
{
foreach($file in $TarfilesToExtract)
{
7z x $file
}
foreach($file in $TgzFilesToExtract)
{
7z x $file
}
}
}
更简短的版本:
$cont=true
cd c:\Extracted
$files = get-childItem -include *.tar,*.tgz -Recurse
foreach($file in $TarfilesToExtract)
{
7z x $file -oC:\Pathfolder
}
cd c:\Pathfolder
while($cont -eq "true")
{
$files = get-childItem -include *.tar,*.tgz -Recurse
if($files.Length -eq 0)
{
$cont = "False"
}
else
{
foreach($file in $files)
{
7z x $file
}
}
}
答案2
这对我来说效果很好:
FOR /R "C:\whatever" %I IN (*.gz) DO .7z x "%I" -aou -o"%~dpI"
C:\whatever
是查找的路径、*.tgz
要提取的文件类型以及.7z
7zip 的位置(在本例中为 PATH 上)。
之后我还想删除所有压缩文件:
FOR /R "C:\whatever" %I IN (*.gz) DO del "%I"
正如链接的线程中提到的,最好先使用@ECHO 测试命令:
FOR /R "C:\whatever" %I IN (*.gz) DO @ECHO.7z x "%I" -aou -o"%~dpI"
答案3
这些是我对这个问题的看法:我创建了以下脚本来递归解压文件夹结构中的所有 .7z 和所有 .zip 文件。
您可能不需要 - 所以您可以根据需要删除这些行: - 因为我计划在提取后删除所有 .7z 和 .zip 文件,所以我创建了一个 cleanup.ps1 文件(出于安全原因,我没有立即删除档案)。 - 如果出现任何提取错误,我已将提取命令放入文件 ExecUnpack.ps1 中,以便能够再次提取单个档案
del "Cleanup.ps1";
del "ExecUnpack.ps1";
del "ExecUnpack.cmd";
get-childitem . -recurse -include @("*.7z","*.zip") | foreach {
"""C:\Program Files\7-Zip\7z.exe"" x ""$($_.FullName)"" -y -o""$($_.FullName.Replace(" .7z", "\").Replace(".7z", "\").Replace(" .zip", "\").Replace(".zip", "\"))""" | Out-File -Append "ExecUnpack.ps1"
"""C:\Program Files\7-Zip\7z.exe"" x ""$($_.FullName)"" -y -o""$($_.FullName.Replace(" .7z", "\").Replace(".7z", "\").Replace(" .zip", "\").Replace(".zip", "\"))""" | Out-File -Append "ExecUnpack.cmd"
$proc=[System.Diagnostics.Process]::Start("C:\Program Files\7-Zip\7z.exe", "x ""$($_.FullName)"" -y -o""$($_.FullName.Replace(" .7z", "\").Replace(".7z", "\").Replace(" .zip", "\").Replace(".zip", "\"))""");
$proc.WaitForExit();
echo "ExitCode=$($proc.ExitCode.ToString()) - $($_.FullName)";
"#ExitCode=$($proc.ExitCode.ToString()) - $($_.FullName)" | Out-File -Append "Cleanup.ps1";
"del ""$($_.FullName)""" | Out-File -Append "Cleanup.ps1";
}
其中主要部分如下:
get-childitem . -recurse -include @("*.7z","*.zip") | foreach {
$proc=[System.Diagnostics.Process]::Start("C:\Program Files\7-Zip\7z.exe", "x ""$($_.FullName)"" -y -o""$($_.FullName.Replace(" .7z", "\").Replace(".7z", "\").Replace(" .zip", "\").Replace(".zip", "\"))""");
$proc.WaitForExit();
echo "ExitCode=$($proc.ExitCode.ToString()) - $($_.FullName)";
}