kamelle
Goto Top

Ca. 600.000 Archive in komplexer Ordnerstruktur entpacken

Ich habe ca 600.000 .zip Archive in einer komplexen Ordnerstruktur zu entpacken. Die Ordnerstruktur soll erhalten bleiben.
Ich habe schon diverse Anläufe in CMD mit 7-zip und WinRar oder als Batch probiert, aber nichts geht.

Die meisten Unzipper sind darauf ausgelegt, dass ich die Archive markiere, um sie dann zu entpacken. Das ist bei der Menge an Archiven aber schier unmöglich. Auch beim globalen Suchen um sie dann zu markieren und in einen Ordner zu entpacken, kommt mein Ryzen 7700 Rechner an seine Grenzen. Außerdem verliere ich so meine Ordnerstruktur.
Auch Powershell wills nicht machen

Hat jemand einen rekursiven Batch für cmd, 7-zip, WinRar oder Powershell, mit dem ich das Problem lösen kann?

Content-ID: 670186

Url: https://administrator.de/contentid/670186

Ausgedruckt am: 16.12.2024 um 01:12 Uhr

gastric
gastric 14.12.2024 aktualisiert um 23:38:11 Uhr
Goto Top
Hi.
Alle ZIPs n einen einzigen Ordner, oder jedes in ein separates, oder jeweils im gleichen Verzeichnis der ZIP-Datei entpacken?

Alle in einen einzigen zentralen Ordner entpacken
$quelle = "d:\daten"  
$ziel = "d:\extrahiert"  
foreach($file in Get-ChildItem $quelle -File -Filter *.zip -Recurse){
    Expand-Archive -Path $file.Fullname -DestinationPath $ziel -Force
}

Alle im jeweiligen Ordner der ZIP Datei entpacken
$quelle = "d:\daten"  
foreach($file in Get-ChildItem $quelle -File -Filter *.zip -Recurse){
    Expand-Archive -Path $file.Fullname -DestinationPath $file.DirectoryName -Force
}

WinRar & Co machen es aber auch out of the box bspw. rekursiv für alle ZIPs mit einem einzigen Befehl

Alle ZIPs in einen gemeinsamen Ordner
winrar x -r d:\daten\*.zip d:\ziel\

usw.

Gruß gastric
DivideByZero
DivideByZero 14.12.2024 um 18:57:22 Uhr
Goto Top
Moin,

oben hast Du die Lösung in Powershell, aber natürlich geht das auch mit jedem guten Archiver anders über die Kommandozeile. Winrar, 7zip arbeiten da einwandfrei. Da muss nichts markiert werden. Das, was Du schilderst, scheint über die GUI getestet zu sein, das macht natürlich bei der Masse keinen Sinn.

Lösungsweg generisch: rekursive Suche der Archive, auf das Archiv dann den Entpackbefehl anwenden. Also das, was Du perfekt serviert bekommen hast oben in Powershell.

Gruß

DivideByZero
Kamelle
Kamelle 14.12.2024 aktualisiert um 19:30:48 Uhr
Goto Top
Die Powershell Lösung endet ohne das was getan wurde.

Hab die rar Lösung gestartet, mal sehen was passiert.
gastric
gastric 14.12.2024 aktualisiert um 21:45:39 Uhr
Goto Top
Zitat von @Kamelle:

Die Powershell Lösung endet ohne das was getan wurde.
Kann ich nicht bestätigen, klappt hier einwandfrei ! Hast wohl die ExecutionPolicy oder den Dateifilter im Skript nicht an deine Umgebung angepasst
Kamelle
Kamelle 14.12.2024 aktualisiert um 21:58:35 Uhr
Goto Top
Dir rar Lösung klappt auch nicht.
Meldung: .zip ist kein rar Archiv.

Bei der powershell Lösung habe ich das auf meinen Ordner geändert:
$quelle = "E:\Disk-E"
foreach($file in Get-ChildItem $quelle -File -Filter *.zip -Recurse){ Expand-Archive -Path $file.Fullname -DestinationPath $file.DirectoryName -Force
}
prinzjulius
prinzjulius 14.12.2024 aktualisiert um 22:06:45 Uhr
Goto Top
Guten Abend,
ich hatte mal ein ähnliches Problem, wenn auch bei weitem nicht so umfangreich. Dazu hatte ich ein PowerShell-Script zusammengebaut, dass mithilfe von 7z rekursiv durch alle Verzeichnisse iteriert und alle ".zip"-Dateien an exakt dem Pfad entpackt.

Im "Oberverzeichnis" wird zusätzlich ein Log angelegt.

<#

.SYNOPSIS
    Entpackt alle .zip-Dateien in einem Verzeichnis und dessen Unterverzeichnissen mithilfe von 7-Zip
    und protokolliert den Vorgang in einer Logdatei.

.DESCRIPTION
    Dieses Script durchsucht ein angegebenes Verzeichnis und alle Unterverzeichnisse nach .zip-Dateien.
    Jede gefundene .zip-Datei wird mit 7-Zip in das gleiche Verzeichnis entpackt. Erfolgreiche oder fehlerhafte
    Entpackungen werden in einer Logdatei protokolliert.

.NOTES
    Version:    2024-12-14
    Autor:      Julius Prinz

.PARAMETER RootPath
    Das Verzeichnis, das nach .zip-Dateien durchsucht werden soll.

.PARAMETER SevenZipPath
    Der vollständige Pfad zur ausführbaren 7z.exe-Datei.

#>

<# Parameter #>
param(
    [Parameter(Mandatory = $true)]
    [string]$RootPath,

    [Parameter(Mandatory = $false)]
[string]$SevenZipPath = "$($env:ProgramFiles)\7-Zip\7z.exe"  
)

<# Variablen #>
# Überprüfen, ob der Pfad zu 7z.exe korrekt ist
if (-not (Test-Path -Path $SevenZipPath)) {
    Write-Error "Die angegebene 7z.exe konnte nicht gefunden werden: $SevenZipPath"  
    return
}

# Überprüfen, ob das Quellverzeichnis existiert
if (-not (Test-Path -Path $RootPath)) {
    Write-Error "Das angegebene Verzeichnis existiert nicht: $RootPath"  
    return
}

# Erstellen des Log-Dateinamens
$LogFileName = (Get-Date -Format ""yyMMdd-HHmmss"") + ".log"  
$LogFilePath = Join-Path -Path $RootPath -ChildPath $LogFileName

<# Funktionen #>
function Write-Log {
    param (
        [string]$Message
    )
    # Nachricht in die Logdatei schreiben
    Add-Content -Path $LogFilePath -Value $Message
}

function Extract-ZipFile {
    param (
        [string]$ZipFilePath,
        [string]$SevenZipExecutable
    )

    # Zielverzeichnis ist das gleiche wie das der Zip-Datei
    $TargetDirectory = [System.IO.Path]::GetDirectoryName($ZipFilePath)

    # Entpacken der Datei mit 7z.exe
    $process = Start-Process -FilePath $SevenZipExecutable -ArgumentList "x", "`"$ZipFilePath`"", "-o`"$TargetDirectory`"", "-y" -NoNewWindow -PassThru -Wait  

    # Fehlerbehandlung
    if ($process.ExitCode -ne 0) {
        $LogMessage = "FEHLER: $ZipFilePath"  
        Write-Warning "Fehler beim Entpacken der Datei: $ZipFilePath"  
    } else {
        $LogMessage = "ERFOLG: $ZipFilePath"  
        Write-Output "Erfolgreich entpackt: $ZipFilePath"  
    }

    # Lognachricht schreiben
    Write-Log -Message $LogMessage
}

<# Programm #>
# Logdatei initialisieren
Write-Log -Message "Entpackung gestartet: $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')"  

# Alle .zip-Dateien im Quellverzeichnis und seinen Unterverzeichnissen finden
$ZipFiles = Get-ChildItem -Path $RootPath -Recurse -Filter "*.zip" -File  

if ($ZipFiles.Count -eq 0) {
    $NoFilesMessage = "Keine .zip-Dateien im Verzeichnis gefunden: $RootPath"  
    Write-Log -Message $NoFilesMessage
    Write-Output $NoFilesMessage
    return
}

# Jede gefundene .zip-Datei entpacken
foreach ($ZipFile in $ZipFiles) {
    Write-Output "Entpacken von: $($ZipFile.FullName)"  
    Extract-ZipFile -ZipFilePath $ZipFile.FullName -SevenZipExecutable $SevenZipPath
}

Write-Log -Message "Entpackung beendet: $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')"  
Write-Output "Alle .zip-Dateien wurden verarbeitet. Logdatei: $LogFilePath"  


<# Signatur #>

Aufruf:

.\New-UnzipJob.ps1 -RootPath "C:\OberstesVerzeichnis"  
prinzjulius
prinzjulius 14.12.2024 um 22:11:00 Uhr
Goto Top
Ich kommen übrigens auf ca. 1 sek pro Testarchiv mit je einer kleinen Textdatei. Das sollten dann etwa 7 volle Tage dauern bei 600.000 Dateien. Ich hoffe du wirst dieses Jahr noch fertig face-wink
Kamelle
Kamelle 14.12.2024 aktualisiert um 22:20:01 Uhr
Goto Top
@gastric: Hab jetzt von RemoteSigned auf Unrestricted umgeswitched.
Deine zweite Lösung in eine .ps1 geschrieben und angepasst.
Dann in Powershell gestartet.

Wieder ohne Maßnahmen geendet.
gastric
gastric 14.12.2024 aktualisiert um 22:25:22 Uhr
Goto Top
Es gibt keine Ausgaben ... Du musst auch den Dateifilter anpassen, wenn die Dinger nicht *.zip als Ending haben.
Klappt hier wie gesagt einwandfrei. Ansonsten sind deine Dateien wohl inkompatible Zips, ohne Fehlermeldungen können wir hier schlecht helfen...
Das sollten dann etwa 7 volle Tage dauern bei 600.000 Dateien. Ich hoffe du wirst dieses Jahr noch fertig face-wink
Dafür gibt's foreach -parallel , bzw. MultiThreading, dann muss nur noch die CPU und die Platte ausreichend schnell sein😉
kreuzberger
kreuzberger 14.12.2024 um 22:37:07 Uhr
Goto Top
@Kamelle

allein schon wegen der großen zahl ist es eine ungewöhnliche aufgäbe.

Wieder ohne Maßnahmen geendet.
kann es sein, dass zumindest einige ZIPs mit Passwort geschützt sind?

Kreuzberger
Kamelle
Kamelle 14.12.2024 aktualisiert um 23:14:07 Uhr
Goto Top
@prinzjulius:
Ich bekomme die Meldung::
Suggestion [3,General]: The command "7z_unzip.ps1" was not found, but does exist in the current location.
PowerShell does not load commands from the current location by default (see ''Get-Help about_Command_Precedence'').

Hab .\ vergessen, endet trotzdem sofort.
Kamelle
Kamelle 14.12.2024 aktualisiert um 22:49:15 Uhr
Goto Top
@gastric: Sind allesamt .zip Archive.
prinzjulius
prinzjulius 14.12.2024 aktualisiert um 23:03:38 Uhr
Goto Top
Zitat von @Kamelle:

@prinzjulius:
Ich bekomme die Meldung::
Suggestion [3,General]: The command "7z_unzip.ps1" was not found, but does exist in the current location.
PowerShell does not load commands from the current location by default (see ''Get-Help about_Command_Precedence'').

Du befindest dich in PowerShell und bist in dem Verzeichnis, wo sich die .ps1 befindet? Dann bitte ".\" vor "7z_unzip.ps1" nicht vergessen.

Sollte dann etwa so aussehen:

PS C:\PS> .\7z_unzip.ps1 -RootPath "C:\PS\test"  
Kamelle
Kamelle 14.12.2024 aktualisiert um 23:24:24 Uhr
Goto Top
Hab eingegeben
PS E:\PS> .\7z_unzip.ps1 -RootPath "E:\Disk_E"

Endet trotzdem sofort ohne Fehlermeldung.
prinzjulius
prinzjulius 14.12.2024 um 23:37:30 Uhr
Goto Top
Zitat von @Kamelle:

Hab eingegeben
.\7z_unzip.ps1 -RootPath "E:\Disk_E"

Endet trotzdem sofort ohne Fehlermeldung.

Das heißt für mich Skript läuft, aber nichts gefunden.

Hast du denn die notwendigen Lese-/Schreib-Rechte? Schon mit erhöhten Rechten ("als Administrator ausführen") versucht?
Liegt unter "E:\Disk_E" eine Logdatei?

Du kannst ja direkt unter "E:\Disk_E" mal eine .zip legen und gucken, ob diese verarbeitet wird.
gastric
gastric 14.12.2024 aktualisiert um 23:42:51 Uhr
Goto Top
Dir rar Lösung klappt auch nicht.
Meldung: .zip ist kein rar Archiv.

Dann hast du statt der winrar.exe die rar.exe genommen die winrar Version kann auch mit ZIPs auf der Kommandozeile umgehen. Auch das klappt hier im Test ohne Probleme.

RTFM darfst auch du gerne
https://documentation.help/WinRAR/HELPCommandLineSyntax.htm

Scheint als laufe bei dir überhaupt nüscht am Wochenende 🤣.

Jute Nacht .
Kamelle
Kamelle 15.12.2024 aktualisiert um 06:47:00 Uhr
Goto Top
Kann es daran liegen, dass auch andere Formate in den Ordnern liegen?

PS oder CMD wurden immer unter einem admin account als Administrator gestartet.
gastric
gastric 15.12.2024 aktualisiert um 08:14:30 Uhr
Goto Top
Zitat von @Kamelle:

Kann es daran liegen, dass auch andere Formate in den Ordnern liegen?
Nein, außer du hast andere Formate mit der Endung zip versehen, dann müsste er aber auch Fehler werfen.
PS oder CMD wurden immer unter einem admin account als Administrator gestartet.
Welche Powershell Version/Skriptumgebung verwendest du genau unter welchem OS?
gastric
gastric 15.12.2024 aktualisiert um 09:10:45 Uhr
Goto Top
Ach ja und hier noch der Beweis, dass es funktioniert, falls du noch zweifelst ...
Online Demoskript
MirkoKR
MirkoKR 15.12.2024 aktualisiert um 11:55:59 Uhr
Goto Top
@Kamelle

... gib doch im Script mal eine Testausgabe in die Console mit ..

... darüber dann die Ausgabe, welches Verzeichnis und ggf. Datei es gerade scannt, bearbeitet ...

... dadurch siehst du, ob sas Script soweit funktioniert ...
MirkoKR
MirkoKR 15.12.2024 aktualisiert um 17:59:00 Uhr
Goto Top
Ich hab da jetzt, weil ich nicht so Powershell-Afin bin, mal ChatGPT gefragt:


Habs nicht getestet, und ggf. kannst du die Aufgabe an chatGPT mit deinen exakten Wünschen anpassen ...

1000040588
Kamelle
Kamelle 15.12.2024 um 16:55:01 Uhr
Goto Top
@MirkoKR:
Ich würde das Script gerne ausprobieren. Könntest du es mir kopierbar zusenden?
aqui
aqui 15.12.2024 aktualisiert um 17:06:58 Uhr
Goto Top
Ich hab da jetzt, weil ich nicht so Powershell-Afin bin, mal ChatGPT gefragt:
Dann solltest du es hier im Forum auch entsprechend der Forenregeln kennzeichnen!! face-sad
Wie gehen wir in Zukunft mit KI-Inhalten um?
aibut
Eigentlich auch sinnfrei AI zu fragen, denn Kollege @gastric hat ja oben ein problemlos laufendes PS Script gepostet was deutlich effizienter ist als der 10mal so lange Kram von der AI! face-sad
DivideByZero
DivideByZero 15.12.2024 um 17:11:34 Uhr
Goto Top
Zitat von @Kamelle:

@MirkoKR:
Ich würde das Script gerne ausprobieren. Könntest du es mir kopierbar zusenden?

Wo ist das Problem? Der prompt steht doch oben, einfach ChatGPT befragen. Wobei natürlich die Anmerkung von aqui voll zutrifft.
Kamelle
Kamelle 15.12.2024 aktualisiert um 17:35:35 Uhr
Goto Top
@prinzjulius:
Script läuft, hat nur eine Fehlermeldung im LOG wegen Datum.

@MirkoKR:
Hab auch mal spasseshalber Chatgpt gefragt. Gibt mir auch ein Script, aber anders aufgebaut. Läuft auch.

# Definiere den Startordner
$startFolder = "E:\Disk_E" # Ändere den Pfad zu deinem "etest" Verzeichnis

  1. Hole alle ZIP-Dateien rekursiv im Startordner
$zipFiles = Get-ChildItem -Path $startFolder -Recurse -Filter "*.zip"

  1. Durchlaufe jede ZIP-Datei und entpacke sie in denselben Ordner
foreach ($zipFile in $zipFiles) {
$destinationFolder = $zipFile.DirectoryName # Zielordner ist der Ordner der ZIP-Datei
Write-Host "Entpacke $($zipFile.FullName) nach $destinationFolder"

          1. Entpacke die ZIP-Datei
          Expand-Archive -Path $zipFile.FullName -DestinationPath $destinationFolder -Force
          }
MirkoKR
MirkoKR 15.12.2024 um 17:55:35 Uhr
Goto Top
Zitat von @aqui:

Ich hab da jetzt, weil ich nicht so Powershell-Afin bin, mal ChatGPT gefragt:
Dann solltest du es hier im Forum auch entsprechend der Forenregeln kennzeichnen!! face-sad

Ja, prinzipiell hast du Recht!

Aber hier haben wir keinen "verdeckten KI-Beitrag", sondern das Fragen der KI als Thema und ist somit deutlichst gekennzeichnet.

Ich werde bei künftigen Kommentaren dieser Art aber versuchen, die Regel umzusetzen.
Kamelle
Kamelle 15.12.2024 um 20:03:11 Uhr
Goto Top
Mit dem AI Script war dann doch wohl nix.
prinzjulius
prinzjulius 15.12.2024 aktualisiert um 20:18:46 Uhr
Goto Top
Script läuft, hat nur eine Fehlermeldung im LOG wegen Datum.

Stell gerne einmal das LOG rein, dann kann ich das evtl. beseitigen.
Entpackt das Skript denn jetzt auch die Archive, oder bricht es weiterhin ab?
Kamelle
Kamelle 15.12.2024 um 20:37:45 Uhr
Goto Top
Es entpackt 😄, nur ich sehe keinen log file.
prinzjulius
prinzjulius 15.12.2024 um 20:54:00 Uhr
Goto Top
E:\Disk_E

Das sollte unter "E:\Disk_E" liegen und heißt "241215-204901.log" oder so. Also entsprechend der Uhrzeit, wann du das Skript gestartet hast. Sollte dann etwa so aussehen:
Entpackung gestartet: 2024-12-15 20:52:56
FEHLER: C:\PS\test\Set-CryptoSettings.zip
ERFOLG: C:\PS\test\01\Set-CryptoSettings.zip
ERFOLG: C:\PS\test\01\01a\Set-CryptoSettings.zip
ERFOLG: C:\PS\test\01\01b\Set-CryptoSettings.zip
ERFOLG: C:\PS\test\02\Set-CryptoSettings.zip
Entpackung beendet: 2024-12-15 20:53:03

So kannst du nachher nachvollziehen, ob irgendwo Archive nicht verarbeitet worden sind.
Lochkartenstanzer
Lochkartenstanzer 15.12.2024 aktualisiert um 22:11:57 Uhr
Goto Top
Moin,

ist eigentlich ein bash-einzeiler. Enteder mit einem llive-linux wie knoppix booten oder das Windows-Subsystem für Linux + ein Linux nach Wahl installieren und in der Bash folgendes eingeben:

find /Pfad/zum/Root/verzeichnis/der/dateien/  -iname "*.zip" | sed -e "s:.zip$::g" | xargs -I XXXX 7z x -oXXXX XXXX.zip  

lks