zero1de
Goto Top

Lösche Verzeichniss per script

Hallo,

ich brauche einen Script (egal VBS, powershell oder c#) der Verzeichnisse durchsucht und bei bedarf löschen und protokolliert.
Ich habe folgende Struktur:

D:\xxx\xx_207\archiv\20091227
unter d:\xxx\ werden immer neue Verzeichnisse mit xx_208, xx_209 usw.. angelegt die sollen nicht gelöscht werden auch der Unterordner "Archiv" soll nicht gelöscht werden. Gelöscht wird nur der Ordner 20091227 oder 20091228, 20091229 aber auch nur dann, wenn mehr als 5 Ordner drin sind. Dann sollen natürlich nur die ältesten gelöscht werden, bis die letzte 5 Ordner bleiben.

Bei diesem Bespiel hier, soll nur die Unterordner 20091226, 20091227 gelöscht werden da im Verzeichnis D:\xxx\xx_207\archiv\ mehr als 5 Unterordner vorhanden sind. Rest bleibt. Das selbe gilt dann auch für andere Archive

D:\xxx\xx_207\archiv\20091221
D:\xxx\xx_207\archiv\20091222
D:\xxx\xx_207\archiv\20091223
D:\xxx\xx_207\archiv\20091224
D:\xxx\xx_207\archiv\20091225
D:\xxx\xx_207\archiv\20091226
D:\xxx\xx_207\archiv\20091227

Kann mir jemand helfen?
THX im Vorraus

Content-Key: 216562

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

Printed on: April 24, 2024 at 16:04 o'clock

Member: Lochkartenstanzer
Lochkartenstanzer Sep 10, 2013 updated at 11:41:39 (UTC)
Goto Top
Moin

so als schnellschuß:

#/bin/bash

ls -d "D:\\xxx\\xx_207\\archiv\\*" | tail -$(expr $(ls -d "D:\\xxx\\xx_207\\archiv\\*"  | wc -l) - 5) | xargs rm -v 

face-smile

lks

EDIT:

Die Idee dahinter, falls Du das nachprogrammieren willst:

  • Ein dirlisting in D:\xxx\xx_207\archiv\* gibt die die verzeichnisse dort wider.
  • ein wc zähl die Zeilen und zieht 5 davon ab.
  • das tail schneidet de ersten 5 zeilen davon ab
  • und das was herausfällt sind die verzeichnisnamen, die gelöscht werden können. (heead statt tail läßt die letzten 5 statt der ersten 5 verzeichnisse stehen).
Member: Snowman25
Snowman25 Sep 10, 2013 updated at 11:30:02 (UTC)
Goto Top
Ich glaube, der TS braucht zumindest eine Windows-Lösung face-smile
(auch, wenn er das nicht spezifiert hat face-big-smile)
Member: Lochkartenstanzer
Lochkartenstanzer Sep 10, 2013 updated at 11:32:16 (UTC)
Goto Top
Zitat von @Snowman25:
Ich glaube, der TS braucht zumindest eine Windows-Lösung face-smile
(auch, wenn er das nicht spezifiert hat face-big-smile)

Der TO sagte

> ich brauche einen Script (egal VBS, powershell oder c# ...

Und die Bash gibt es auch unter windows. entweder standalone oder mit cygwin.

lks
Member: Snowman25
Snowman25 Sep 10, 2013 at 11:32:58 (UTC)
Goto Top
Zitat von @Lochkartenstanzer:
Und die Bash gibt es auch unter windows. entweder standalone oder mit cygwin.
Wenn auch umständlich, aber recht hast du.
Member: Lochkartenstanzer
Lochkartenstanzer Sep 10, 2013 at 11:35:52 (UTC)
Goto Top
Zitat von @Snowman25:
> Zitat von @Lochkartenstanzer:
> ----
> Und die Bash gibt es auch unter windows. entweder standalone oder mit cygwin.
Wenn auch umständlich, aber recht hast du.

Wieso umständlich. Ich habe auf den "wichtigen" Windowskisten immer ein cygwin mit drauf. Das ist kaum Mehraufwand, das mitzuinstallieren und die Einzeiler sind schneller "hingerotzt" als erst ein powershell oder cmd-batch zu schreiben.

lks
Member: bastla
bastla Sep 10, 2013 updated at 17:13:20 (UTC)
Goto Top
@ lks
Einen Batch braucht das auch nicht - direkt in CMD etwa so:
for /d %i in ("D:\xxx\xx_*") do @for /f "skip=5" %a in ('dir /b/o-n/ad "%i\archiv"') do @echo rd "%i\archiv\%a"
Ist etwas länger geworden, weil ja nicht nur der Ordner "D:\xxx\xx_207" behandelt werden soll (und auch noch ein "Sicherheits-echo" zum Testen drin ist) ...

Grüße
bastla
Member: Lochkartenstanzer
Lochkartenstanzer Sep 10, 2013 at 18:24:38 (UTC)
Goto Top
Zitat von @bastla:
@ lks
Einen Batch braucht das auch nicht - direkt in CMD etwa so:


bash kann ich halt besser als cmd face-smile

lks
Member: zero1de
zero1de Sep 11, 2013 at 13:47:17 (UTC)
Goto Top
Danke nowman25 du kannst pro Aktive denken. Übrigen ich brauche eine vbs oder powershell script und keine Sprüche Leute face-smile
Member: zero1de
zero1de Sep 11, 2013 at 13:52:39 (UTC)
Goto Top
Danke für die Mühe aber :

D:\dwh\pu_207\archiv\20091227 es wird nur im untersten Subfolder gelöscht. Die suche läuft ab
hier D:\dwh rekursive durch und löscht nur Subfolder die unter D:\dwh\pu_207\archiv\XXXXXXX drin sind und bei Count > 5 nur die ältesten Folder löschen.
Member: bastla
bastla Sep 11, 2013 at 16:16:26 (UTC)
Goto Top
Hallo zero1de!
ich brauche eine vbs oder powershell script
Was spricht gegen CMD/Batch?

Grüße
bastla
Member: zero1de
zero1de Sep 12, 2013 at 13:24:46 (UTC)
Goto Top
Hi,

bekomme folgende Meldung mit deinem Batch:

D:\dwh>rd "D:\dwh\pu_212\archiv\20130902"
Das Verzeichnis ist nicht leer.
Member: zero1de
zero1de Sep 12, 2013 at 13:52:01 (UTC)
Goto Top
So würde es im cmd direkt laufen aber wie kann ich das als *.bat oder cmd ausführen und das Ergebnis mit Protokollieren ?

for /d \dwh\pu_*") do @for /f "skip=5" i\archiv"') do rmdir "a" /s /q
Member: bastla
bastla Sep 12, 2013 at 17:18:54 (UTC)
Goto Top
Hallo zero1de!

In einem Batch ist "%i" durch "%%i" zu ersetzen.

Da "rd" keine Ausgabe erzeugt musst Du das zum Protokollieren selbst erledigen - am Beispiel meines Ansatzes oben etwa so:
for /d %%i in ("\dwh\pu_*") do for /f "skip=5" %%a in ('dir /b/o-n/ad "%%i\archiv"') do rd /s /q "%%i\archiv\%%a">nul && >>Log.txt echo "%%i\archiv\%%a" geloescht || >>Log.txt echo "%%i\archiv\%%a" nicht geloescht
Grüße
bastla
Member: Biber
Biber Sep 12, 2013, updated at Sep 13, 2013 at 13:55:20 (UTC)
Goto Top
Moin bastla,

ich weiss ja nicht....
Klar, das ist genau das, was dieser zero-Frager sich gewünscht hat.
Außer, dass es jetzt doch ein CMD-Batch ist. face-wink

Aber so ein Logfile macht doch überhaupt keinen Sinn.

Wenn die Mimik gewesen wäre:
  • alle Archiv-Verzeichnisse von 2009 bis 2012 durchzuwackeln
  • und alles auf ein externes Medium zu sichern
  • und danach alles Gesicherte in einem Archiv-Verzeichnis zu löschen (oder alles bis auf die jüngsten 5)
  • und den ganzen Prozess in eine Logdatei zu drücken...

-> das hätte etwas.

Aber in einer Logdatei zu protokollieren "Ich habe Unterverzeichnisse xy in \20091218\ gelöscht...." ?
Was soll das bringen? Auch wenn du die Logdatei in Plexiglas vergilbungssicher konservierst - das hilft doch keinem im nächsten August, wenn einer diese Archive sucht.

Zumindest solltest du diesen unfreundlichen Komiker mal darauf hinweisen.
Mir würde dafür die Geduld fehlen.

Grüße
Biber
Member: bastla
bastla Sep 12, 2013, updated at Sep 13, 2013 at 13:55:01 (UTC)
Goto Top
Hallo Biber!
Zumindest solltest du diesen unfreundlichen Komiker mal darauf hinweisen.
Dem habe ich nix mehr hinzuzufügen.

Grüße
bastla
Member: zero1de
zero1de Sep 13, 2013 at 07:06:03 (UTC)
Goto Top
Die Logdatei soll als Kontrolle dienen, damit ich weiß welche Datei gelöscht wurden und wann.
Member: zero1de
zero1de Sep 13, 2013 at 07:08:24 (UTC)
Goto Top
Hi Bastla,

Irgendwie bekomme ich das nicht zum laufen > Syntaxfehler !!!.
Wie ich schon sagte, ich muss das Batch/Script Zeitgesteuert starten deshalb als cmd Datei.

Gruß
zero1de
Member: Biber
Biber Sep 13, 2013 at 14:10:47 (UTC)
Goto Top
Zitat von @zero1de:
Die Logdatei soll als Kontrolle dienen, damit ich weiß welche Datei gelöscht wurden und wann.
Wenn du sehen können willst, WANN eine Datei gelöscht wurde, dann solltest du vielleicht noch %date% und %time% mit in die Logdatei schreiben.
Sonst siehst du nur, DASS gelöscht wurde.

Zitat von @zero1de:
Wie ich schon sagte, ich muss das Batch/Script Zeitgesteuert starten deshalb als cmd Datei.
Wie "Wie ich schon sagte..." ????
Mag sein, dass du es gesagt hast, aber das hört doch hier keiner.
Du musst es in deinen Beitragstext schreiben, sonst ahnt es niemand.

Grüße
Biber
Member: bastla
bastla Sep 13, 2013 at 15:33:44 (UTC)
Goto Top
Hallo zero1de!
Irgendwie bekomme ich das nicht zum laufen > Syntaxfehler !!!.
Irgendwie bekomme ich den Syntaxfehler nicht hin ...
D:\TEMP>tree D:\dwh
Auflistung der Ordnerpfade für Volume TEMP
Volumenummer: 1234-5678
D:\DWH
+---pu_207
¦   +---archiv
¦   ¦   +---20091223
¦   ¦   +---20091224
¦   ¦   +---20091225
¦   ¦   +---20091226
¦   ¦   +---20091227
¦   ¦   +---20091221
¦   ¦   +---20091222
¦   ¦   +---20091228
¦   ¦   +---20091229
¦   +---tst
+---pu_208
    +---archiv
        +---20100102
        +---20100103
        +---20100104
        +---20100105
        +---20100106
        +---20100107
        +---20100108

D:\TEMP>type LoeschenBisAuf5.cmd
for /d %%i in ("\dwh\pu_*") do for /f "skip=5" %%a in ('dir /b/o-n/ad "%%i\archiv"') do rd /s /q "%%i\archiv\%%a">nul && >>Log.txt echo "%%i\archiv\%%a" geloescht || >>Log.txt echo "%%i\archiv\%%a" nicht geloescht

D:\TEMP>LoeschenBisAuf5.cmd

D:\TEMP>for / %i in ("\dwh\pu_*") do for /F "skip=5" %a in ('dir /b/o-n/ad "%i\archiv"') do rd /s /q "%i\archiv\%a"  1>nul  && echo "%i\archiv\%a" geloescht  1>>Log.txt  || echo "%i\archiv\%a" nicht geloescht 1>>Log.txt

D:\TEMP>for /F "skip=5" %a in ('dir /b/o-n/ad "\dwh\pu_207\archiv"') do rd /s /q "\dwh\pu_207\archiv\%a"  1>nul  && echo "\dwh\pu_207\archiv\%a" geloescht  1>>Log.txt  || echo "\dwh\pu_207\archiv\%a" nicht geloescht 1>>Log.txt

D:\TEMP>rd /s /q "\dwh\pu_207\archiv\20091224"  1>nul  && echo "\dwh\pu_207\archiv\20091224" geloescht  1>>Log.txt  || echo "\dwh\pu_207\archiv\20091224" nicht geloescht 1>>Log.txt

D:\TEMP>rd /s /q "\dwh\pu_207\archiv\20091223"  1>nul  && echo "\dwh\pu_207\archiv\20091223" geloescht  1>>Log.txt  || echo "\dwh\pu_207\archiv\20091223" nicht geloescht 1>>Log.txt

D:\TEMP>rd /s /q "\dwh\pu_207\archiv\20091222"  1>nul  && echo "\dwh\pu_207\archiv\20091222" geloescht  1>>Log.txt  || echo "\dwh\pu_207\archiv\20091222" nicht geloescht 1>>Log.txt

D:\TEMP>rd /s /q "\dwh\pu_207\archiv\20091221"  1>nul  && echo "\dwh\pu_207\archiv\20091221" geloescht  1>>Log.txt  || echo "\dwh\pu_207\archiv\20091221" nicht geloescht 1>>Log.txt

D:\TEMP>for /F "skip=5" %a in ('dir /b/o-n/ad "\dwh\pu_208\archiv"') do rd /s /q "\dwh\pu_208\archiv\%a"  1>nul  && echo "\dwh\pu_208\archiv\%a" geloescht  1>>Log.txt  || echo "\dwh\pu_208\archiv\%a" nicht geloescht 1>>Log.txt

D:\TEMP>rd /s /q "\dwh\pu_208\archiv\20100103"  1>nul  && echo "\dwh\pu_208\archiv\20100103" geloescht  1>>Log.txt  || echo "\dwh\pu_208\archiv\20100103" nicht geloescht 1>>Log.txt

D:\TEMP>rd /s /q "\dwh\pu_208\archiv\20100102"  1>nul  && echo "\dwh\pu_208\archiv\20100102" geloescht  1>>Log.txt  || echo "\dwh\pu_208\archiv\20100102" nicht geloescht 1>>Log.txt

D:\TEMP>tree D:\dwh
Auflistung der Ordnerpfade für Volume TEMP
Volumenummer: 1234-5678
D:\DWH
+---pu_207
¦   +---archiv
¦   ¦   +---20091225
¦   ¦   +---20091226
¦   ¦   +---20091227
¦   ¦   +---20091228
¦   ¦   +---20091229
¦   +---tst
+---pu_208
    +---archiv
        +---20100104
        +---20100105
        +---20100106
        +---20100107
        +---20100108

D:\TEMP>type Log.txt
"\dwh\pu_207\archiv\20091224" geloescht
"\dwh\pu_207\archiv\20091223" geloescht
"\dwh\pu_207\archiv\20091222" geloescht
"\dwh\pu_207\archiv\20091221" geloescht
"\dwh\pu_208\archiv\20100103" geloescht
"\dwh\pu_208\archiv\20100102" geloescht

D:\TEMP>
Grüße
bastla
Member: zero1de
zero1de Sep 16, 2013 at 08:37:32 (UTC)
Goto Top
Hi Bastla,

vielen Dank für deine Mühe. Es funktioniert.

Thx
zero1de