ZIP-Archive rekursiv verarbeiten, um Dateien zu extrahieren, während ein bestimmtes Format von Dateien verworfen wird

4950
Fr0zenFyr

UPDATE: Ich habe bemerkt, dass viele Leute diesen Thread sehen, was mich glauben lässt, dass diese Situation nicht so selten ist. Wie auch immer, ich hatte so eine ähnliche / verwandten Fragen gestellt auf hier, was ziemlich anständig Lösungen zu hat, die das Problem in einer besseren Art und Weise lösen könnte.

Auf meinem Windows 7-Computer habe ich ein Verzeichnis mit heruntergeladenen Dumps in ZIP-Archiven. Jedes Archiv enthält wenige Textdateien, PDFs und selten XML-Dateien. Ich möchte den gesamten Inhalt jedes ZIP-Archivs in seinen entsprechenden Ordner extrahieren (muss während des Vorgangs erstellt werden), während das Extrahieren von PDF-Dateien verworfen / ignoriert wird. Nach dem Extrahieren der erforderlichen Dateien aus einem Archiv darf die verarbeitete ZIP-Datei nicht gelöscht werden (oder ich möchte wissen, wie ich sie in verschiedenen Situationen steuern kann).

Wenn es hilfreich ist zu wissen, liegt die Anzahl der Archive im Verzeichnis im Bereich von 60.000 bis 70.000. Außerdem benötige ich separate Ausgabeverzeichnisse, da Dateien in einem Archiv möglicherweise denselben Namen haben wie Dateien in anderen.

Zum Beispiel,

  • Ich habe alle meine Archive wie one.zip, two.zip, .. in, sagen wir,D:\data
  • Ich erstelle einen neuen Ordner für verarbeitete Daten. D:\extracted
  • Nun sollten die Daten von D:\data\one.zipnach gehen D:\extracted\one. Hier D:\extracted\onesollte automatisch angelegt werden.
  • Während dieses vollständigen Dekomprimierungsvorgangs sollten alle gefundenen PDF-Dateien nicht extrahiert (ignoriert) werden. Es ist sinnlos zu extrahieren und dann zu löschen.
  • (Optional) Eine Protokolldatei sollte beispielsweise gepflegt werdenD:\extracted. Die Idee ist, diese Datei zu verwenden, um die Verarbeitung dort fortzusetzen, wo sie im Fehlerfall belassen wurde.
  • (Optional) Mit dem Skript sollte ich entscheiden, ob ich Quellarchive behalten oder nach der Verarbeitung löschen möchte.

Ich habe bereits einige Suchen durchgeführt, um eine Lösung zu finden, konnte aber keine finden. Ich bin auf wenige Fragen wie diese gestoßen

  1. Entpacken Sie die Dateien rekursiv, wo sie sich befinden, und löschen Sie die Archive
  2. 7 Zip-Extrakt rekursiv
  3. Ist es möglich, den Inhalt der ZIP-Datei rekursiv mit 7 zip aufzulisten, ohne sie zu extrahieren

Aber sie waren keine große Hilfe (ich bin übrigens kein Profi mit Windows). Ich bin offen für die Installation sicherer und werbefreier Drittanbieter-Software (Open-Source) wie 7-zip.

BEARBEITEN: Gibt es ein Werkzeug, das verfügbar ist, was ich brauche ? Ich habe bereits Multi Unpacker ausprobiert . Es erstellt keine neuen Verzeichnisse und kann * .pdf-Dateien nicht ignorieren. Es beginnt sogar langsam, ich denke, es liest zuerst alle Archive an der Quelle, bevor sie mit der Verarbeitung beginnen.

Danke im Voraus!

0
Ohne Batch- oder Powershell-Skript kann ich dies nicht umgehen. Soweit ich weiß, gibt es für so etwas keine Out-of-the-Box-Lösung. private_meta vor 9 Jahren 0
@private_meta danke für deine Antwort. Ich hatte es bereits erraten, aber es ist gut, sicher zu sein. Kannst du mich in die richtige Richtung weisen, wenn du dafür eine Powershell schreibst. Ich verstehe auch, dass das Ignorieren von PDFs während der Extraktion eine große Herausforderung ist. Ich bin also bereit, das Skript alles extrahieren zu lassen und dann die PDFs zu löschen. Fr0zenFyr vor 9 Jahren 0
verwandt: http://superuser.com/q/321829/243637 Fr0zenFyr vor 7 Jahren 0

1 Antwort auf die Frage

1
private_meta

Durch das Ändern der hier gefundenen Antwort sollte dieses Teil des PowerShell-Skripts das tun, was Sie möchten. Speichern Sie es einfach als Datei mit der Erweiterung ".ps1". Wenn Sie es aufrufen, rufen Sie es einfach als ./filename.ps1 auf. Es extrahiert die Dateien in separate Ordner, löscht die ZIP-Dateien und entfernt alle Dateien mit der Erweiterung .pdf. Ich habe nicht getestet, ob es mit rekursiven Pfaden richtig funktioniert, aber es sollte, bitte testen Sie es.

Bearbeiten: Wenn Sie nicht möchten, dass Ihre ZIP-Dateien gelöscht werden, entfernen Sie die Zeile oder kommentieren Sie sie aus (#)rmdir -Path $_.FullName -Force

Voraussetzungen: PowerShell, 7-zip und zum Festlegen des 7-zip-Pfads in der Datei.

param([string]$folderPath="D:\Blah\files")  Get-ChildItem $folderPath -recurse | %{   if($_.Name -match "^*.`.zip$") { $parent="$(Split-Path $_.FullName -Parent)";  write-host "Extracting $($_.FullName) to $parent"  $arguments=@("e", "`"$($_.FullName)`"", "-o`"$($parent)\$($_.BaseName)`""); $ex = start-process -FilePath "`"C:\Program Files\7-Zip\7z.exe`"" -ArgumentList $arguments -wait -PassThru;  if( $ex.ExitCode -eq 0) { write-host "Extraction successful, deleting $($_.FullName)" rmdir -Path $_.FullName -Force $arguments1="$($parent)\$($_.BaseName)\*.pdf" rmdir -Recurse -Path $arguments1 } } } 
Ich habe darüber nachgedacht, Sie zu bitten, mir zu helfen, den Code aus derselben Antwort zu ändern. Sie sind ein Gedankenleser. Ich werde diesen Code ausprobieren und den Fortschritt hier berichten. Ich bin wirklich froh, dass Sie sich die Zeit genommen haben, meine Frage sorgfältig durchzulesen und fast jeden Aspekt davon abgedeckt haben. Fr0zenFyr vor 9 Jahren 0
Sie können es als Basis verwenden und nach Bedarf ändern. Der Teil über das Nicht-Extrahieren von PDF-Dateien ist in erster Linie eine große Herausforderung. Ich glaube nicht, dass es mit normalen Tools funktionieren würde. private_meta vor 9 Jahren 0
Wenn Sie mehr als einen "param" verwenden, müssen Sie sie wie folgt aufrufen: "./script.ps -folderPath path -delete" und so weiter. Informationen zu Switches finden Sie unter [this] (http://www.powershellmagazine.com/2013/12/20/ using-powershell-switch-vs-boolean-parameters-in-sma-runbooks/). private_meta vor 9 Jahren 0
Danke Kumpel, ich gebe dir meinen Hut. Dieses Skript hat fast alles erreicht, was ich wollte (außer der Protokolldatei). Da es keine bessere Antwort gibt, akzeptiere ich Ihre Antwort als Lösung. Oh, und übrigens, standardmäßig erlaubte mir die PowerShell meines Systems nicht, das Skript auszuführen, das besagte, dass es deaktiviert ist. Ich hatte zwei Möglichkeiten, entweder das Skript zu signieren oder "set-ExecutionPolicy Unrestricted" in PowerShell als Administrator auszuführen. Ich habe beides ausprobiert und sie haben gearbeitet, obwohl der erste die bessere Wahl ist, aber nicht in diesem Kommentar. Fr0zenFyr vor 9 Jahren 0
Hallo zusammen, das Skript hat wunderbar funktioniert, nur in einem Fall habe ich es herausgefunden. Nur wenige meiner ZIP-Dateien hatten Unterordner, das Skript extrahierte den Ordner und platzierte seinen Inhalt parallel dazu (außerhalb des Unterverzeichnisses). Kann das irgendwie behoben werden? Ich hatte auch ein paar Dateien, die `.tar` und` .zip` enthielten. Was sollte ich also tun, wenn ($ _. Name -match "^ *. '. Zip $") `rekursiv verarbeitet werden soll ? Danke im Voraus. Fr0zenFyr vor 9 Jahren 0
Wenn Sie $ arguments = @ ("e", `durch $ arguments = @ (" x ",` sollte die Verzeichnisstruktur beibehalten) ersetzen, testen Sie das bitte. Über die rekursive Extraktion weiß ich nicht, ob es richtig funktioniert Sie können das Skript jedoch selbst mit einem neuen Verzeichnis aufrufen, in diesem Fall jedes Unterverzeichnis.Wenn sich eine ZIP-Datei im Stammverzeichnis des Ordners befindet, wird sie entpackt komplizierter, aber ich bin nicht gut genug mit Powershell. private_meta vor 9 Jahren 1
Ich habe jetzt angefangen, Power Shell abzulehnen, es scheint verwirrend und kompliziert zu sein. Ich versuche das jetzt mit einem Batch-Skript zu managen, ich habe schon viel in nur einer Zeile gemacht. Vielen Dank für die Antwort. Ich habe gerade eine [Frage zu SO] (http://stackoverflow.com/q/24339419/1369473) gepostet, dort können Sie meinen Fortschritt sehen. Fr0zenFyr vor 9 Jahren 0