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?
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?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 670186
Url: https://administrator.de/contentid/670186
Ausgedruckt am: 16.12.2024 um 01:12 Uhr
31 Kommentare
Neuester Kommentar
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
Alle im jeweiligen Ordner der ZIP Datei entpacken
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
usw.
Gruß gastric
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
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
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
Kann ich nicht bestätigen, klappt hier einwandfrei ! Hast wohl die ExecutionPolicy oder den Dateifilter im Skript nicht an deine Umgebung angepasst
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.
Aufruf:
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"
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...
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😉
@Kamelle
allein schon wegen der großen zahl ist es eine ungewöhnliche aufgäbe.
Kreuzberger
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
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'').
@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"
Zitat von @Kamelle:
Hab eingegeben
.\7z_unzip.ps1 -RootPath "E:\Disk_E"
Endet trotzdem sofort ohne Fehlermeldung.
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.
Dir rar Lösung klappt auch nicht.
Meldung: .zip ist kein rar Archiv.
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 .
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?
Ach ja und hier noch der Beweis, dass es funktioniert, falls du noch zweifelst ...
Online Demoskript
Online Demoskript
@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 ...
... 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 ...
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!! Wie gehen wir in Zukunft mit KI-Inhalten um?
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!
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!! 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.
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.
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:
lks
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