Como recursivamente extrair todos os arquivos .tar e .tgz compactados em um arquivo .tgz usando a versão de linha de comando 7zip

0

Estou usando a versão da linha 7zip cmd no meu aplicativo (escrito em Python na caixa Win 7) para extrair arquivos .tgz. Embora eu esteja usando a opção -r, os subdiretórios .tar e .tgz não são extraídos. Alguém pode me dizer se eu estou com vista para algo ou dar alguma direção ... obrigado! Abaixo está uma variante do comando que eu tentei assim:

C:> 7za e c:\Extracted\name.tgz -oc:\PathFolder *.tar -r
    
por suffa 19.02.2012 / 17:41

3 respostas

3

Aqui está o código que deve fazer o que você quiser (observação: ele preserva todas as estruturas de diretórios. Se você não quiser isso, altere o x para um e . Execute isso em 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  
        }  
    }  
}  

Uma versão mais curta e simples:

$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 
        }
    }
}
    
por 19.02.2012 / 18:23
0

Isso funcionou bem para mim:

FOR /R "C:\whatever" %I IN (*.gz) DO .7z x "%I" -aou -o"%~dpI"

C:\whatever sendo o caminho para procurar, *.tgz sendo os tipos de arquivos a serem extraídos e .7z sendo a localização de 7zip (no PATH neste caso).

Eu também queria remover todos os arquivos compactados depois:

FOR /R "C:\whatever" %I IN (*.gz) DO del "%I"

Como mencionado no encadeamento ligado, seria uma boa idéia testar o comando primeiro com um @ECHO:

FOR /R "C:\whatever" %I IN (*.gz) DO @ECHO.7z x "%I" -aou -o"%~dpI"
    
por 17.04.2014 / 14:02
0

Estes são meus 5 cêntimos para este problema: Eu criei o seguinte script para descompactar todos os arquivos .zz e todos os arquivos .zip de forma recursiva na minha estrutura de pastas.

Pode não ser exigido por você - para que você possa soltar essas linhas se quiser:  - Como pretendo remover todos os arquivos .7z e .zip após a extração, criei um arquivo cleanup.ps1 (não os excluí imediatamente por motivos de segurança).  - Em caso de qualquer erro de extração, eu coloquei os comandos de extração no arquivo ExecUnpack.ps1 para poder extrair o arquivo único novamente

del "Cleanup.ps1"; 
del "ExecUnpack.ps1"; 
del "ExecUnpack.cmd"; 
get-childitem . -recurse -include @("*.7z","*.zip") | foreach { 
    """C:\Program Files-Zipz.exe"" x ""$($_.FullName)"" -y -o""$($_.FullName.Replace(" .7z", "\").Replace(".7z", "\").Replace(" .zip", "\").Replace(".zip", "\"))""" | Out-File -Append "ExecUnpack.ps1"
    """C:\Program Files-Zipz.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-Zipz.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"; 
}

Onde esta é a parte principal:

get-childitem . -recurse -include @("*.7z","*.zip") | foreach { 
    $proc=[System.Diagnostics.Process]::Start("C:\Program Files-Zipz.exe", "x ""$($_.FullName)"" -y -o""$($_.FullName.Replace(" .7z", "\").Replace(".7z", "\").Replace(" .zip", "\").Replace(".zip", "\"))"""); 
    $proc.WaitForExit(); 
    echo "ExitCode=$($proc.ExitCode.ToString()) - $($_.FullName)"; 
}
    
por 07.11.2017 / 16:57