rui
Goto Top

Unterverzeichnisse mit gleichem Namen mit 7-Zip packen

Alle Unterverzeichnisse mit dem gleichen Namen, zB. "_old" in jeweils ein 7-Zip-Archiv verschieben, das als Namen das Erstellungsdatum bekommt

Hallo erstmal,

ich bin neu hier und wie kann es anders sein habe natürlich gleich ein Problem welches ich euch hier darlegen möchte.
Ich hoffe ich habe nicht einen möglichen Lösungsansatz hier im Forum übersehen. Gestern habe ich einiges von "Biber" und einigen anderen zu "Bätches" quergelesen, jedoch leider bis auf das Problem mit dem Datum im Namen nichts gefunden, was mir weiterhilft.

Unter XP Prof. sollen alle Unterverzeichnisse eines Verzeichnisses nach "_old" per durchsucht werden. Dieses sind Verzeichnisse, keine Dateien. Die "_old"-Verzeichnisse werden mehrmals vorkommen, da jeweils für ein Projekt Unterverzeichnisse wie "daten" oder "bilder" existieren. In diesen Verzeichnissen wiederum gibt es die "_old"-Verzeichnisse. Also ..\bilder\_old und ..\daten\_old und ... etc.
Zur besseren Versionskontrolle, um Platz zu sparen und zur besseren Übersicht sollen diese "-old"-Verzeichnisse bzw. deren Daten also jeweils in eine 7-Zip Datei verschoben und diese mit aktuellem Datum benannt werden.
Zum Ende eines Projektes könnte man also alle in "_old"-Verzeichnissen vorhandenen 7-Zip Dateien in ein Gesamtarchiv verschieben, welches man gesondert sichern kann. Übrig bleibt ein von erstmal "überflüssigen" Dateien gesäubertes Projekte-Verzeichniss, welches man mit den anderen Projekte-Verzeichnissen ebenfalls sichern kann. Man hätte zum Schluß zwei Sicherungskopien. Eine kleine feine mit aktuell "fertigen" Projekten, und eine zweite mit allen übrigen oder nur den "unfertigen" Daten.

Ich hoffe ich konnte mein Problem einigermaßen verständlich darlegen.
Evtl. hat ja einer von euch einen Lösungsansatz parat mit dem ich anfangen könnte. Momentan tappe ich noch zu sehr im dunkeln.

Dank im voraus

Content-ID: 38038

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

Ausgedruckt am: 22.11.2024 um 11:11 Uhr

Biber
Biber 16.08.2006 um 00:17:35 Uhr
Goto Top
Moin rui,

Du hast doch alles schon sauber in die notwendigen Einzelschritte zerlegt... nach Deiner Beschreibung kann ich es einfach runtertippen.
::--- 7z_old.bat---------- Placed into the public Domain by Biber 2006
@echo off & setlocal & Set "STDOUT=NUL"  
Set "DEBUG=@echo" && set "STDOUT=CON" &&  REM delete this line when testing successful  
set "my7zip=d:\programme\7-zip\7z.exe" && REM STEP 1: Wo ist das 7zip-Commandline-Tool?  
for %%i in (%date%) do (
   for /f "tokens=1-3 delims=." %%a in ("%%i") do (  
    set "mydate=%%c-%%b-%%a" && REM STEP 2: Datumsvariable %myDate% definieren   
))
REM mydate sollte jetzt im Format JJJJ-MM-TT gesetzt sein, z.B 2006-08-15
REM Step 3 Für alle Unterzeichnisse namens "_old" tue....  
for /f "delims=" %%i in ('dir /s /b /a:d \_old') do (  
   %DEBUG% %my7zip% u -y "%%~dpni\%myDate%"  "%%~dpni\*.*" >%STDOUT% 2>&1  
   if exist "%%~dpni\%myDate%.7z" for %%x in ("%%~dpni\*.*") do (  
     if /i "%%x" NEQ "%%~dpni\%myDate%.7z" %DEBUG% del "%%x" >%stdout  
))

Diese Zeile:
Set "DEBUG=@echo" && set "STDOUT=CON" &&  REM delete this line when testing successful  
..nach dem Testen einfach löschen oder mit vorangestelltem "REM " auskommentieren.

Der Batch geht davon aus, dass sich die "_old"-Verzeichnisse auf dem aktuellen Laufwerk befinden.
Falls nach dem 7Zip-Aufruf eine Datei namens HeutigesDatum.7z in diesem _Old-Verzeichnis existiert, werden alle Dateien außer dieser gelöscht.

Ich würde diese Mimik allerdings insofern verfeinern, dass
- entweder auch das Verzeichnis "_old" umbenannt wird in "_oldaktuellesDatum
- oder diese *.7z-Datei SOFORT verschoben wird nach irgendwohin..
aber dann sollte sie nicht "2006-08-15.7z" heißen, sondern z.B. "UrlaubBallermann2004_bilder_old_2006-08-15.7z",
wenn sie vorher im Verzeichnis "\UrlaubBallermann2004\bilder\_old" angelegt wurde.

Aber ich wollte hier auch nur den Einstieg skizzieren.

Hope That Helps
Biber
rui
rui 16.08.2006 um 15:35:46 Uhr
Goto Top
Hallo Biber,

danke das du dir die Zeit dafür genommen hast.
Es funktioniert schon ganz gut. Aber das eine oder andere hatte ich nicht bedacht, bzw. erläutert.
In einem _old-Verzeichniss können noch andere Verzeichnissstränge liegen. Diese sollten mitgepackt werden.

Um bei deinem Beispiel mit dem Bilderverzeichniss zu bleiben:
..\bilder\_old\naja\
..\bilder\_old\fertig\
etc.

Mit 7-Zip kann ich zwar die ganze Verzeichnisstruktur unter _old packen (einfach statt *.* nur *) aber mit 7-Zip kann man meines Wissens nach nicht in ein Archiv verschieben. Also bleiben jetzt die Unterverzeichnisse von _old und die Dateien darin stehen.
Allerdings wußte ich auch nicht, daß man einfach die 7z.exe per batch ansprechen kann. Ich dachte immer, man bräuchte noch extra die 7za.exe als standalone, bzw. comandline Version.
Wieder was neues gelernt. face-smile

Du hast natürlich recht, wenn du schreibst, daß man um Datenverlust zu vermeiden, die 7z-Datei evtl. umbennen sollte oder das Verzeichnis. Hatte ich nicht bedacht.
Ursprünglich hatte ich mir überlegt, das bei mehrmaligen start der batch am selben Tag, die einmal erstellte 7z-Datei "upgedatet" wird. Ab dem nächsten Tag würde eine neue 7z-Datei erstellt werden, die alles neue bis auf die vorher erstellten 7z-Dateien beinhaltet. (-x!*.7z) Dies aber würde bedeuten, 7z-Dateien würden nie mitgepackt werden, was ich jetzt wo ich es schreibe, auch nicht so pfiffig finde. Da muß ich wohl noch etwas mehr Gehirnschmalz benutzen. face-smile

Keine Ahnung wie man das lösen sollte. Die Idee dahinter war ja, das man solange ein Projekt noch nicht fertig ist, noch alles in demselben Verzeichnis unter zB. ..\bilder\_old und ..\daten\_old findet und nicht lange suchen muß. Das Bilder- oder Daten-Verzeichnis zB. wären aber trotzdem aufgräumt und platzsparend zum archivieren vorbereitet.
Biber
Biber 16.08.2006 um 16:02:26 Uhr
Goto Top
Moin rui,

ich denke auch, dass bei Deinem Problem jetzt erstmal das "Handwerkliche" zurückgestellt werden kann - vorher muss erst mal das Konzept zu Ende gedacht werden.

Was ich zumindest empfehlen würde:
Dass sich unterhalb einer "_old"-Struktur wiederum beliebige Verzeichnisstrukturen befinden (können) - das ist ein organisatorisches bzw. Disziplin-Problem. Das darf/kann/muss nicht sein.
Ich weiß auch nicht, wie weit Du eine "professionelle" Versionsverwaltung für Deine Datenumfänge benötigst und ob sich außer "überholten Versionen" einer Datei, die eben ins "_old" gehört, eventuell auch andere Branches, also Irr- oder Alternativwege ergeben, die "sicherheitshalber" auch erhaltenswert sind.

Sonst wirf eventuell vorher nochmal einen Blick auf Versionsverwaltungssysteme wie CVS - bevor wir hier eine Behelfskrücke per Batch zusammentrümmern.

Ich lass Dich erstmal in Ruhe über das Konzept meditieren.. face-wink

Gruß
Biber
rui
rui 17.08.2006 um 10:27:43 Uhr
Goto Top
Moin Biber,

besten Dank nochmal für dein Engagement.

Ich habe mir weiter Gedanken gemacht und das mit den Unterverzeichnissen in _old muß leider sein. Das 7z-Dateien nicht mitgepackt werden ist letzendlich nicht so schlimm. Sie sind ja schon gepackt und nehmen dadurch wenig Platz ein, und zum Schluß sollen ja alle 7z-Dateien in _old gesichert werden.
Das ganze mit CVS zu erreichen hatte ich auch kurz angedacht, aber es letztendlich verworfen. Zuviele unterschiedliche Dateitypen und zu großer Overhead für meine Vorstellungen. Außerdem soll das ganze ja auch sehr Platzsparend angelegt sein, deshalb ja die Idee es mit 7-Zip anzulegen.

So, ich glaube das Grundsätzliche ist nach eingehender Meditation jetzt doch etwas klarer geworden. ;)
Wenn du vielleicht auch noch mal das "handwerkliche" etwas näher beleuchten könntest, könnte ich vielleicht noch zur Erleuchtung gelangen. ;)

Gruß
rui
Biber
Biber 20.08.2006 um 11:49:21 Uhr
Goto Top
Moin rui,

bin nun doch etwas ratlos, wie der nächste Schritt zur Lösung Deiner Anforderung aussehen könnte/sollte.

Wenn der obige Schnipsel täglich läuft, also z.B auch heute, dann sind danach auf der ganzen Platte in allen denkbaren Unterzeichnissen namens "_old" irgendwelche 2006-08-20.7z-Dateien.
Wobei es IMHO nach wie vor nur Probleme gibt, wenn auch "_old"-Unterverzeichnisse dabei sind, die wiederum Unterverzeichniszweigen enthalten.
Wenn diese Unterzweige auch gezipt werden, müsste konsequenterweise danach auch die Unterverzeichnisstruktur selbst gelöscht werden, oder?

However - Du könntest als nächsten Schritt nun alle Dateien mit dem Namen 2006-08-20.7z mit XCopy oder ähnlichen Tools incl. Pfadangaben in ein anderes Rootverzeichnis kopieren und dieses wiederum zu einer einzigen 7z-Datei zusammendampfen.
Dann in der ursprüglichen Aktuelle-Projekte-Verzeichnisstruktur alle 2000-08-20.7z-Dateien löschen.

Gute Nachricht - 80% Deiner erhofften größeren Übersichtlichkeit ist gegeben: im Aktuellen-Projekte-Verzeichnis ist jetzt Ruhe.
Schlechte Nachricht: Wenn Du tatsächlich mal eine bestimmte Deiner ins "_old" ausgelagerten Dateien wieder suchst, dann müsstest Du in mehreren 7z-Dateien rumwühlen, bis Du die richtige Datei wiedergefunden hast.

Hat auch nicht so richtig den Charme, diese Lösung.
Da wäre es sogar noch sinnvoller, alle _old-Dateien tägliche mit XCopy auf eine R/W-CD zu brennen und nicht weiter zu verdichten.

Wie ist denn jetzt Deine Vision für die nächsten Schritte?
Oder können wir diesen Thread erstmal schließen, weil der Rest jetzt organisatorisch und nicht bätschisch gelöst werden wird?

Gruß
Biber
rui
rui 21.08.2006 um 10:49:51 Uhr
Goto Top
Moin Biber,

das die Unterverzeichnisse per Batch mitgezipt und anschließend gelöscht ist noch ein Problem, das noch auf eine Lösung hoft.

Falls du, oder jemand anderes hier im Forum dahingehend einen Lösungsansatz wüßte, wäre das natürlich super.

Der Rest, da gebe ich dir Recht, wäre eher ein organisatorisches Problem. Dafür bräuchten wir diesen Thread hier nicht mehr offenhalten.
Die Idee hinter dieser angestrebten Lösung wäre, das man irgendwann ein "fertiges" Projekt hat mit dementsprechend nur noch den aktuellen Dateien. Falls man wirklich noch etwas daran machen müßte, könnte man ja die gezippten Daten ab einem bestimmten Datum wieder in ein neues Verzeichnis entpacken. Dort würde sich die Suche eigentlich sehr einfach gestallten.
Auch bei einem "Meilenstein" vor Fertigstellung des Projektes könnte man so verfahren.
Dafür bräuchte man aber die gesamte Verzeichnisstruktur, die man evtl. in das "_old"-Verzeichnis verschoben hat. Also ist und bleibt das packen der Unterverzeichnisse erstmal das Hauptproblem dieser batcherei.

Gruß
Rui
AD
AD 22.03.2008 um 11:59:50 Uhr
Goto Top
Hallo Biber,

ich wollte gern mittels diesem Script, eine Backup-Script aufbauen und scheiter irgendwie kläglich. Mein Ziel ist es von Verzeichnis %in% nach dem Verzeichnis Backup suchen. Alles Rekursiv (inkl. Verzeichnisse) mit winrar packen und dann an einen bestimmten Ort verschieben. Aber irgendwie durchsucht er alles vom Root Verzeichnis an nach dem Backup Verzeichnis.

echo OFF & setlocal & Set "STDOUT=NUL"
set in="C:\TEST"
REM set out="C:\BAND005"
REM set logging="C:\BAND005\Logs"

Set "DEBUG=@echo" && set "STDOUT=CON" && REM delete this line when testing successful
Set "winrar=C:\Programme\WinRAR\rar.exe" && REM STEP 1: Wo ist das winrar-Commandline-Tool?

for %%i in (%date%) do (
for /f "tokens=1-3 delims=." %%a in ("%%i") do (
set "mydate=%%c%%b%%a" && REM STEP 2: Datumsvariable %myDate% definieren
))

REM mydate sollte jetzt im Format JJJJMMTT gesetzt sein, z.B 20060815
REM Step 3 Für alle Unterzeichnisse namens "backup" tue....
cd %in%
for /f "delims=" %%i in ('dir /s /b /a:d \backup') do (
%DEBUG% %winrar% a -m5 -r -o- -tsmca -idp "%%~dpni\%myDate%" "%%~dpni\*.*" >%STDOUT% 2>&1
if exist "%%~dpni\%myDate%.rar" for %%x in ("%%~dpni\*.*") do (
if /i "%%x" NEQ "%%~dpni\%myDate%.rar" %DEBUG% del "%%x" >%stdout
))


PAUSE


Hättest du eine Lösung???

Frohe Ostern

Danke & Gruß AD
Biber
Biber 22.03.2008 um 15:53:07 Uhr
Goto Top
Moin AD,

das Wechseln mit "cd %in%" zeigt deshalb wenig Wirkung, weil der darauf folgende DIR-Befehl ab dem Root-Verzeichnis (\) ansetzt:
...for /f "delims=" %%i in ('dir /s /b /a:d \backup') do (  

Damit der DIR-Befehl so arbeitet wie von Dir geplant, musst Du es so ändern:
...for /f "delims=" %%i in ('dir /s /b /a:d .\backup') do (  

Grüße
Biber
Concurve
Concurve 12.11.2016 um 06:57:40 Uhr
Goto Top
Hallo Biber,

zugegeben ... das Thema ist nun schon etwas älter aber "Old but Gold".

Ich habe versucht Deinen Code ...

::--- 7z_old.bat---------- Placed into the public Domain by Biber 2006
@echo off & setlocal & Set "STDOUT=NUL"  
Set "DEBUG=@echo" && set "STDOUT=CON" &&  REM delete this line when testing successful  
set "my7zip=d:\programme\7-zip\7z.exe" && REM STEP 1: Wo ist das 7zip-Commandline-Tool?  
for %%i in (%date%) do (
   for /f "tokens=1-3 delims=." %%a in ("%%i") do (  
    set "mydate=%%c-%%b-%%a" && REM STEP 2: Datumsvariable %myDate% definieren   
))
REM mydate sollte jetzt im Format JJJJ-MM-TT gesetzt sein, z.B 2006-08-15
REM Step 3 Für alle Unterzeichnisse namens "_old" tue....  
for /f "delims=" %%i in ('dir /s /b /a:d \_old') do (  
   %DEBUG% %my7zip% u -y "%%~dpni\%myDate%"  "%%~dpni\*.*" >%STDOUT% 2>&1  
   if exist "%%~dpni\%myDate%.7z" for %%x in ("%%~dpni\*.*") do (  
     if /i "%%x" NEQ "%%~dpni\%myDate%.7z" %DEBUG% del "%%x" >%stdout  
))

... so umzuschreiben, dass er mir zweckdienlich ist. Jedoch mache ich hier mehr Fehler als das es hilfreich wäre.

@echo on & setlocal & Set "STDOUT=NUL"  
Set "DEBUG=@echo" && set "STDOUT=CON" &&  REM delete this line when testing successful  
set "my7zip=C:\Program Files\7-Zip\7z.exe" && REM STEP 1: Wo ist das 7zip-Commandline-Tool?  
set "quelle=C:\Users\ARGT\Desktop\Test"  
for %%i in (%date%) do (
   for /f "tokens=1-3 delims=." %%a in ("%%i") do (  
    set "mydate=%%c-%%b-%%a" && REM STEP 2: Datumsvariable %myDate% definieren   
))
REM mydate sollte jetzt im Format JJJJ-MM-TT gesetzt sein, z.B 2006-08-15
REM Step 3 Für alle Unterzeichnisse namens "NEF" tue....  
for /f "delims=" %%i in ('dir /s /b /a:d \NEF') do (  
   %DEBUG% %my7zip% u -y "%%~dpni\%myDate%"  "%%~dpni\*.*" >%STDOUT% 2>&1  
   if exist "%quelle%\*.NEF" for %%x in ("%quelle%\*.*") do (  
     if /i "%%x" NEQ "%%~dpni\%~dp0.7z" %DEBUG% del "%%x" >%stdout  
))

REM FOR /R %quelle% %%I IN (*.NEF*;) DO del /s %%I
pause

Kurze Vorab-Erklärung:
Ordner „n“ (1-5) = Name der Ordner ist variabel
Ordner „NEF“ = Wenn *.NEF-Bild-Dateien im Ordner „XY“ der 2. Ebene vorhanden sind, so gibt es einen Ordner mit der Benennung „NEF“, gibt es keinen Ordner „NEF“, so gibt es auch keine *.NEF-Dateien (RAW-Dateien)


Was ist gegeben und was brauche ich:
„Hauptordner“ im Netzlaufwerk
Ordner 1 in 1. Ebene
Ordner 2 in 1. Ebene
Ordner 1 in 2. Ebene
*.jpg-Datei
*.mp3-Datei
*.*-Datei
Ordner 2 in 2. Ebene
*.jpg-Datei
*.mp3-Datei
*.*-Datei
Ordner „NEF“ in 3. Ebene
1.NEF-Datei
2.NEF-Datei
2.NEF-Datei
Ordner 3 in 2. Ebene
*.jpg-Datei
*.mp3-Datei
*.*-Datei
Ordner „NEF“ in 3. Ebene
1.NEF-Datei
2.NEF-Datei
Ordner 4 in 2. Ebene
*.jpg-Datei
*.mp3-Datei
*.*-Datei
Ordner 3 in 1. Ebene
Ordner 4 in 1. Ebene
Ordner 5 in 1. Ebene

Info - Aktuelle Programme: 7z und WinRAR

Ich brächte nun eine *.bat die mir folgendes ermöglicht:
Die *.bat soll in dem Ordner „Ordner 2 in 1. Ebene“ inklusive aller Unterverzeichnisse nach *.NEF-Dateien suchen. Findet sie *.NEF-Dateien, so soll sie diese -immer je „NEF“-Ordner packen.
Die *.zip oder *.rar soll die Benennung aus dem darüber liegendem Ordner erhalten, in diesem Beispiel also dann „Ordner "n" in 2. Ebene.zip“ oder „Ordner "n" in 2. Ebene.rar“.

Die erstelle *.zip oder *.rar verbleibt im Ordner „NEF“, die *.NEF-Dateien sollten aus dem Ordner „NEF“ gelöscht werden.
– Gibt es hier ggf. noch eine Prüffunktion, so dass sichergestellt ist das auch alle *.NEF in der *.zip oder *.rar liegen?

Wäre super wenn Du mir hier weiterhelfen könntest.

Gruß
Con