Як рекурсивно витягти всі .tar і .tgz файли, що стиснуті у файлі .tgz, використовуючи версію командного рядка 7zip


0

Я використовую 7zip cmd версії в моєму додатку (написаний на Python на Win 7) для вилучення .tgz файлів. Хоча я використовую перемикач -r, підкаталоги .tar та .tgz не вилучаються. Може хто-небудь сказати мені, якщо я щось звикнути або дати якийсь напрямок ... спасибі! Нижче наведено варіант команди, яку я намагався таким чином:

C:> 7za e c:\Extracted\name.tgz -oc:\PathFolder *.tar -r

Для уточнення. У вас є архіви з іншими архівами в них, або у вас є набір папок, які всі мають .tar і .tgz файли в них?
soandos

@soandos "архіви з іншими архівами в них ..."
suffa

Відповіді:


3

Ось код, який повинен робити те, що ви хочете (примітка: він зберігає всі структури каталогів. Якщо ви не хочете цього, змініть 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 
        }
    }
}

Це здається, що він буде працювати відмінно, але я не впевнений, що я можу побудувати PowerShell в моєму додатку wxPython, як я можу 7zip (з відкритим вихідним кодом), що він може бути встановлений (в той же час ж / додаток) на будь-яку кількість ПК під керуванням win xp або вище в моєму робочому середовищі?
suffa

@suffa, ви можете зберегти його як файл .ps1, а потім запустити його через командний рядок (так само, як ви працюєте з 7zip), як powershell script1.ps1
soandos

одне питання, який би був правильний синтаксис, щоб витягувати .log і .txt з командного рядка 7zip? Це працює для журналів: 7za.exe e c: Extracted -oc: Extracted * .log -r (я намагався * .log & amp; & amp; * .txt ... але не працював).
suffa

@suffa, так що я не дуже добре з powershell, так що я б зробив те ж саме двічі, один раз для .log і один раз для .txt
soandos

0

Це добре працював для мене:

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"

0

Це мої 5 центів на цю проблему: я створив наступний скрипт, щоб розпакувати всі файли.

Можливо, ви не вимагатимете - ви можете просто залишити ці рядки, якщо хочете:  - Тому що я планую видалити всі .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)"; 
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.