cbli
Goto Top

Dateiendungen in zip finden (ohne entpacken)

Ich möchte gerne Dateien mit einer bestimmten Dateieendung in Zip Dateien finden und daraufhin diese entpacken und in ein anderes verzeichnis kopieren lassen.
Danach sollen die gerade entpackte Zip Datei gelöscht (oder eventuell auch in ein anderes Verzeichnis verschoben werden).

Beispiel:

Ich habe im Verzeichnis d:\test\ 10 zip dateien.
Diese sollen auf Dateien mit der Dateiendung *.xyz abefragt werden (also ob sich in den Zip Dateien ,Dateien mit der Endung xyz) befinden.
Im Neinfall reicht ein simpler Hinweis,beim Jafall sollen diese entpackt werden und in ein anderes Laufwerk und Verzeichnis

c:\entpackt\

kopiert werden.
Außérdem soll automatisch überprüft werden ob sich die entpackten Dateien schon in dem neuen Verzeichnis befinden und wenn ja automatisch überschrieben werden,ohne das ich mit Enter bestätigen muss.
Die bereits abgearbeiteten Zip Dateien sollen wie oben erwähnt entwerder verschoben oder gelöscht werden.
Dies soll so lange laufen bis in dem bestimmten Verzeichnis sich keine Zip Dateien mehr befinden.
Wie mache ich das ,wenn z.b auf verschiedene Dateiendungen abgefragt werden soll und diese dann auch in verschiedene Verzeichnisse kopiert werden sollen (immer das gleiche Verzeichnis entsprechend der Dateiendung).

Wer kann mir helfen ?

Danke
Claus

Content-Key: 43823

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

Printed on: April 19, 2024 at 15:04 o'clock

Member: bastla
bastla Nov 06, 2006 at 18:36:33 (UTC)
Goto Top
Hallo Claus!

Am Beispiel der Commandline-Version von 7zip (http://www.7-zip.org/download.html) Schritt 1 - Entpacken:

7za e *.zip -oD:\Texte -y *.txt -r
7za e *.zip -oD:\Docs -y *.doc -r
...

Kurze Erläuterung:
"e" für Entpacken
"-oD:\Texte" für Zielverzeichnis (muss noch nicht existieren)
"-y": JA-Sager (keine Rückfrage zB beim Überschreiben)
"-r" für die Behandlulng aller im Archiv enthaltenen passenden Dateien (auch aus eventuellen Unterverzeichnissen innherhalb der .zip-Datei)

Was das Löschen/Verschieben anlangt: Wenn alles (alle gewünschten Dateitypen) aus den vorhandenen .zip-Dateien "gesaugt" wurde, könnten ja auch eigentlich alle .zip-Dateien entsorgt werden ...

HTH
bastla
Member: bastla
bastla Nov 06, 2006 at 19:14:40 (UTC)
Goto Top
Ergänzung für den Fall, dass tatsächlich unterschieden werden muss, ob aus einer .zip nun etwas herauszuholen war oder nicht:

@echo off & setlocal
del Entpackt.txt 2>nul
del Nixdrin.txt 2>nul
for %%i in (*.zip) do call :unzip "%%i"  
goto :next
:unzip
for /f "delims=" %%m in ('7za e %1 -oD:\Texte -y *.txt -r') do set Erg=%%m  
If "%Erg%"=="No files to process" echo %1 >> Nixdrin.txt & goto :eof  
echo %1 >> Entpackt.txt & goto :eof
:next
echo Hier geht's vielleicht noch weiter  

Mit der dargestellten Batch-Datei lassen sich die .zip-Dateien einzeln entpacken und je nach Erfolg in einer von zwei Logdateien ("Entpackt.txt" oder "Nixdrin.txt") protokollieren.

Da bei meinen Versuchen kein Errorlevel für den Fall, dass keine Datei zu entpacken war, zurückgeliefert wurde, musste ich die abschließende Meldung "No files to process" als Anhaltpunkt dafür nehmen.

Natürlich kann es im Batch so "weiter gehen", dass noch andere Dateitypen nach dem selben Schema entpackt werden.

Nach Abschluss aller Dekomprimierungsvorgänge könnte dann die "Entpackt.txt" als Basis für die Verschiebe- oder Löschaktion dienen.

Grüße
bastla
Member: Biber
Biber Nov 06, 2006 at 19:25:42 (UTC)
Goto Top
Moin cbli,

wenn Du auf Rückmeldungen und Protokollierung verzichten kannst, dann kannst Du es mit 7za.exe so machen (bastla's Beispiel weitergeführt)

...
::.... in den Tiefen Deiner Batchdatei....
::----un7zip.bat
for %%z in ("f:\Administrator\*.zip" "f:\OtherTools\*.zip") do @(  
       For %%i in (gif tif doc reg xls) do 7za e -r -y "%%z *.%%i  -od:\temp\unzipped\%%i >nul  
       REM ###uncomment if real tough guy ### Del /y "%%z" 
)

Dieser formatierte Oneliner würde
- die Verzeichnisse F:\Administrator und F:\OtherTools nach *.zip-Dateien durchsuchen
- in allen *.zip-Dateien nach *.gif's, *.tif's, *.doc's, *.reg's und *.xls-Dateien fahnden
- die gefundenen ohne Rückfrage in die Verzeichnisse GIF, TIF, DOC, REG, XLS unterhalb von d:\temp\unzipped schieben
- [und wenn Du die zweite Zeile entkommentierst, alle *.ZIP-Dateien nach dem Durchsuchen löschen.]

Vorteil: Du wirst nicht mit Meldungen und Rückfragen belästigt.
Nachteil: Du hast keine Ahnung, was passiert.

Wenn der Batch mal probelaufen soll mit diesem Code unten, dann würde er sagen [wenn das ">nul" nicht wär....]
for %%z in ("f:\Administrator\*.zip" "f:\OtherTools\*.zip") do @(  
       For %%i in (gif tif doc reg xls) do @echo 7za e -r -y "%%z *.%%i  -od:\temp\unzipped\%%i  
)
.....
7za e -r -y "f:\OtherTools\sudowin-bin-0.1.1-r95.exe.zip *.tif  -od:\temp\unzipped\tif  
7za e -r -y "f:\OtherTools\sudowin-bin-0.1.1-r95.exe.zip *.doc  -od:\temp\unzipped\doc  
7za e -r -y "f:\OtherTools\sudowin-bin-0.1.1-r95.exe.zip *.reg  -od:\temp\unzipped\reg  
7za e -r -y "f:\OtherTools\sudowin-bin-0.1.1-r95.exe.zip *.xls  -od:\temp\unzipped\xls  
7za e -r -y "f:\OtherTools\ingroup.zip *.gif  -od:\temp\unzipped\gif  
7za e -r -y "f:\OtherTools\ingroup.zip *.tif  -od:\temp\unzipped\tif  
7za e -r -y "f:\OtherTools\ingroup.zip *.doc  -od:\temp\unzipped\doc  
7za e -r -y "f:\OtherTools\ingroup.zip *.reg  -od:\temp\unzipped\reg  
.... usw. usw.

Das andere Extrem wäre, erstmal in den *.zips's zu lesen und dann Datei für Datei anzufassen bzw. zu extrahieren.

REM .... auslesen aller Dateien *.gif aus einer *.zip-Datei  .... nur der Ansatz am CMD-Prompt:
(=20:20:59  D:\temp=)
>for /f "tokens=1,* delims== " %i in ('7za l -r -slt f:\Administrator\activaid.zip *.gif ^|find "Path ="') do @echo %j  
extensions\Media\ac'tivAid_Eject_eject.gif  
extensions\Media\ac'tivAid_KeyState.gif  
extensions\Media\ac'tivAid_KeyState_CapsLock_On.gif  
extensions\Media\ac'tivAid_KeyState_Lock_On.gif  
extensions\Media\ac'tivAid_KeyState_mini.gif  
extensions\Media\ac'tivAid_KeyState_miniCaps.gif  
extensions\Media\ac'tivAid_KeyState_miniNum.gif  
....

und statt "@echo %j" könntest Du natürlich auch diese Datei "%j" irgendwohin entpacken.

Gruß
Biber
[Edit]
so machen (bastla's Beispiel weitergeführt)
Gemeint war bastla's erstes Beispiel... das zweite kannte ich noch nicht *gg
[/Edit]