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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 216562
Url: https://administrator.de/forum/loesche-verzeichniss-per-script-216562.html
Ausgedruckt am: 24.12.2024 um 17:12 Uhr
20 Kommentare
Neuester Kommentar
Moin
so als schnellschuß:
lks
EDIT:
Die Idee dahinter, falls Du das nachprogrammieren willst:
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
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).
Zitat von @Snowman25:
Ich glaube, der TS braucht zumindest eine Windows-Lösung
(auch, wenn er das nicht spezifiert hat )
Ich glaube, der TS braucht zumindest eine Windows-Lösung
(auch, wenn er das nicht spezifiert hat )
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
Zitat von @Lochkartenstanzer:
Und die Bash gibt es auch unter windows. entweder standalone oder mit cygwin.
Wenn auch umständlich, aber recht hast du.Und die Bash gibt es auch unter windows. entweder standalone oder mit cygwin.
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.
> 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
@ lks
Einen Batch braucht das auch nicht - direkt in CMD etwa so:
Ist etwas länger geworden, weil ja nicht nur der Ordner "D:\xxx\xx_207" behandelt werden soll (und auch noch ein "Sicherheits-
Grüße
bastla
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"
echo
" zum Testen drin ist) ...Grüße
bastla
bash kann ich halt besser als cmd
lks
Hallo zero1de!
In einem Batch ist "
Da "
Grüße
bastla
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
bastla
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.
Aber so ein Logfile macht doch überhaupt keinen Sinn.
Wenn die Mimik gewesen wäre:
-> 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
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.
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
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.Die Logdatei soll als Kontrolle dienen, damit ich weiß welche Datei gelöscht wurden und wann.
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..." ????Wie ich schon sagte, ich muss das Batch/Script Zeitgesteuert starten deshalb als cmd Datei.
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
Hallo zero1de!
Grüße
bastla
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>
bastla