koehlo
Goto Top

Batch Datei: Im Verzeichnis Unterordner durchsuchen und bestimmte Dateien löschen

Hallo zusammen,
und schon mal DANKE an alle die mir Antworten.

Zu mir: Ich bin absoluter Anfänger und werde bestimmt dazu noch die eine oder andere Fage haben - dafür bitte ich um Verständnis ;)

Zu meinem Problem. Ich möchte über eine Batch-Datei folgende Aufgabe steuern.

1. Gehe zu einem bestimmten Verzeichnis
2. Durchsuche alle Unterordner (die Ordnerbezeichnung der Unterverzeichnisse ist nicht bekannt)
3. lösche alle darin enthaltnen Dateien - bis auf das erste Bild.

Beispiel Ordnerstruktur:
G:/Backup/1234567/1234567_01.jpg
G:/Backup/1234567/1234567_02.jpg
G:/Backup/1234567/1234567_03.jpg
G:/Backup/1234567/1234567_04.jpg
G:/Backup/1234567/1234567_05.jpg
G:/Backup/1234567/1234567_06.jpg
G:/Backup/1234567/1234567_07.jpg

Im Ordner - 1234567 - soll also nur noch das erste Bild - 1234567_01.jpg - enthalten sein.


Vielen Dank und Gruß, Koehlo.

Content-Key: 302194

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

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

Member: Biber
Solution Biber Apr 18, 2016 at 13:20:51 (UTC)
Goto Top
Moin koehlo,

willkommen im Forum.

zur Klarstellung:
3. lösche alle darin enthaltnen Dateien - bis auf das erste Bild.
Das "erste Bild" ist
- das älteste in diesem Verzeichnis?
- oder dasjenige, das "sortiert nach Dateinamen" an erster Stelle steht?

Grüße
Biber
Member: koehlo
koehlo Apr 18, 2016 at 13:45:51 (UTC)
Goto Top
Hallo Biber,

vielen Dank für den Willkommensgruß. Grüße zurück.

Die Bilder werden im Ordner numerisch abgelegt.
Also: 1234567_01.jpg, 1234567_02.jpg, usw. (Bildname wie Ordnerbezeichnung)


Gruß, Koehlo.
Member: koehlo
koehlo Apr 18, 2016 at 13:47:37 (UTC)
Goto Top
Sorry, dass Bild "1234567_01.jpg" soll im Ordner verbleiben.
Member: Biber
Solution Biber Apr 18, 2016 updated at 14:07:13 (UTC)
Goto Top
Moin koehlo,

als kleinen Tipp: etwas weiter unten findest du eine Liste mit "Ähnlichen Beiträgen".
Da ist oft wirklich ein sinngemäß gleiches Problem beschrieben und auch gelöst.
Unten z.B der Beitrag "Per Batch Dateien löschen, aber die aktuellsten 2 Dateien lt. Datum im Dateinamen nicht löschen" mit einer powerShell-Lösung.

Grundsätzlich gibt es aber im Forum mehrfach die (reine CMD-Batch-) Lösung mit einer FOR/F-Anweisung und "skip=x".

Beispiel am CMD-Prompt

C:\Users\Biber>for /f "delims= skip=1" %i in ('dir /b /oN desktop\*.*') do @echo Machwas mit %i  
Machwas mit Firefox.lnk
Machwas mit Git Bash.lnk
Machwas mit MayBeNice.txt.lnk
Machwas mit Notepad+.lnk
Machwas mit TOTALCMD.lnk
Wobei
- die Parameter zwischen dir und ordner\wildcards, in diesem Fall /oN die Sortierung angeben (hier: Order by Name )
- das skip=x angibt, wie viele Listenelemente übersprungen werden, hier bei Skip=1 wird ein Element übersprungen
- und natürlich statt "@echo Machwas mit %" wäre die Verarbeitung z.B. ein "delete %i"

Im Batch jeweils 2 Prozentzeichen statt eines, aber das ist pilpul.
Nimm dir erstmal die 2 Minuten, um das Prinzip zu verstehen und turne es am CMD-Prompt nach.
Dann selbst den Transfer, das Übertragen in dein Batch-Problem.
Und dann hast du für heute genug geschafft.

Grüße
Biber
P.S. und wenn es nicht weitergeht: natürlich fragen.
Member: koehlo
koehlo Apr 18, 2016 at 14:26:39 (UTC)
Goto Top
Na das schaue ich mir doch direkt mal an. Vielen Dank.
Member: koehlo
koehlo Apr 18, 2016 updated at 14:56:24 (UTC)
Goto Top
@echo off

C:\Test>for /f "delims= skip=1" %%i in ('dir /b /oN desktop\*.*') do delete %%i

pause
exit


So, ist es wahrscheinlich falsch!
Denn, bei der Ausgabe kommt - Der Befehl "C:\Test" ist entweder falsche geschrieben oder konnte nicht gefunden werden


Ich verzweifle face-smile
Member: Biber
Solution Biber Apr 18, 2016 at 15:42:18 (UTC)
Goto Top
Moin koehlo,

ach was... hier verzweifelt keiner.
Wir fangen dich schon rechtzeitig auf.

Also: beim Beispiel am CMD-Prompt, dem beispiel mit dem einen %-Zeichen vor der Laufvariablen
-> da stand vorweg C:\Users\Biber>, was sich bei der Standard-Prompt ist, wenn ich ein CMD-Fenster öffne.

In einer Batchdatei brauchst (und darfst du ) vor einer Befehlszeile kein C:\Test> oder ähnliches schreiben.

Deine Batchdatei, nennen wir sie mal "meinForFtest001.cmd" im funktionsfähigen Zustand wäre

for /f "delims= skip=1" %%i in ('dir /b /oN desktop\*.*') do @echo delete %%i


Nix mit pause, nix mit exit, denn du testest die ja in einem CMD-Window und befindest dich (wahrscheinlich) im Verzeichnis C:\Users\koehlo

Das @echo habe ich ergänzt, damit der Batch erstmal sagt, was er denn machen würde, wenn er dürfte.
gleich beim ersten Batchentwurf ein "delete" auszutesten, ist eher was für die ganz Harten.

Ansonsten: wenn du dich erstmal OHNE Batch herantasten willst, also nur am CMD-Prompt, dann nimm mein Beispiel
for /f "delims= skip=1" %i in ('dir /b /oN desktop\*.*') do @echo Machwas mit %i
Entweder auf den Unterordner "desktop" bezogen, den ich gewählt habe, oder auf das Unterverzeichnis "G:/Backup/1234567".

Grüße
Biber
Member: koehlo
koehlo Apr 18, 2016 at 17:13:46 (UTC)
Goto Top
... so, der erste Schritt ist gemacht (dank der guten Erklärung)

for /f "delims= skip=1" %%i in ('dir /b /oN d:\TEMP\test\*.*') do @echo delete %%i

Zwei Probleme (wenn ich das richtig lese)

Am CMD-Prompt getestet kommt folgende Ausgabe

delete 2967784
delete 2969753
delete 4299440
delete 5299555
delete 5301340
delete 5302149
delete 5302211
delete 5302393
delete 6133031
delete J546451
delete P309240
delete P438821
delete W536957
Drücken Sie eine beliebige Taste . . .

Soll wohl heißen, alle Ordner werden gelöscht?

Und zweitens, im Verzeichnis "d:\TEMP\test" ist auch ein Ordner der mit einer 0 beginnt, der wird nicht beachtet?


Danke, Gruß, Koehlo
Member: TlBERlUS
Solution TlBERlUS Apr 19, 2016 at 08:23:40 (UTC)
Goto Top
Hi,

ich würde dir empfehlen, das Skript erst einmal an einem Testverzeichnis auszuprobieren, Dann siehst du auch gleich die Effekte, ob das Ergebnis gewünscht ist.

Grüße,

Tiberius
Member: Biber
Solution Biber Apr 19, 2016 updated at 14:53:57 (UTC)
Goto Top
Moin koehlo,

sorry, hab heut etwas Zeitnot.

Also, ergänzend zu TIBERIUS, noch der Tipp:
- öffne ein CMD-Fenster.
- führe dort am CMD-Prompt einzeln aus und betrachte die Ergebnisse:
dir /b /oN d:\TEMP\test\*.*

for /f "delims=" %i in ('dir /b /oN d:\TEMP\test\*.*') do @echo delete %i

for /f "delims= skip=1" %i in ('dir /b /oN d:\TEMP\test\*.*') do @echo delete %i

for /f "delims= skip=3" %i in ('dir /b /oN d:\TEMP\test\*.*') do @echo delete %i
Mach das, bis du merkst, dass du laut "Ach so, ja klar.." und ein patschendes Geräusch gehört hast.

Und zweitens, im Verzeichnis "d:\TEMP\test" ist auch ein Ordner der mit einer 0 beginnt, der wird nicht beachtet?
Dürfte dann erledigt sein.

Und falls tatsächlich in dem "d:temp\test\"-Ordner "Dateien" und "Ordner" sein sollten und du zB nur "Dateien" , nicht aber "Ordner" abfackeln willst oder umgekehrt...
-> Dann kannst du den Datei-Typ beim DIR-Befehl darauf eingrenzen.
dir /b /oN d:\TEMP\test\*.*' --> listet alle Dateien+Ordner im Verzeichnis
dir /b /oN /A-d d:\TEMP\test\*.*' --> listet nur Dateien (Alles außer Directories) im Verzeichnis
dir /b /oN /Ad d:\TEMP\test\*.*' --> listet nur Ordner (Alles watt Directories is') im Verzeichnis

[Edit]
Hilfe zu "DIR" gibt es auch am CMD-Prompt mit dir /?.
[/Edit]

Falls noch was fehlt und ich on the road sein sollte.... TIBERIUS hilft auch weiter.

Grüße
Biber
Member: TlBERlUS
Solution TlBERlUS Apr 19, 2016 at 14:38:59 (UTC)
Goto Top
Zitat von @Biber:
sorry, hab heut etwas Zeitnot.
Hab gehört, SingleMalt hilft dabei das zu entspannen face-smile
Falls noch was fehlt und ich on the road sein sollte.... TIBERIUS hilft auch weiter.
Dein Vertrauen ehrt mich, allerdings bin ich leider eine Niete in batch (habe die Syntax nie verstanden face-sad )
Wenn Powershell möglich ist, kann ich weiterhelfen -> @koehlo
Member: Biber
Solution Biber Apr 19, 2016 updated at 14:51:30 (UTC)
Goto Top
[OT]
Moin tiberius,


Zitat von @TlBERlUS:

Dein Vertrauen ehrt mich, allerdings bin ich leider eine Niete in batch (habe die Syntax nie verstanden face-sad )
Meine Überzeugung war und ist: "Hey, der kann bestimmt Batch oder Improvisieren oder Delegieren."

Wenn du noch zusätzlich Powershell kennst, dann hast du doch vier Werkzeuge zur Auswahl.
Mit den Möglichkeiten hätte Angus MacGyver schon 1989 den Richtkranz auf dem Berliner Flughafen montiert.

Hint: Ich nehme immer das Werkzeug, mit dem ich mich am Sichersten fühle.

Grüße
Biber
[/OT]
Member: koehlo
koehlo Apr 19, 2016 at 14:54:40 (UTC)
Goto Top
Hallo Tiberius, hallo Biber,

ich komme keinen Schritt weiter. Normalerweise stelle ich mich nicht so dusselig an. Sorry.

Ich habe das jetzt wie oben beschrieben - getestet.
Alles schick, ich glaube das auch zu verstehen.

Wenn ich das richtig vertehe, werden die Ordner gelöscht?! - das soll aber nicht sein.
Gelöscht werden sollen - bis auf die erste Datei - alle anderen Dateien IM Ordner (in den Ordnern).
Die Ordner selbst dürfen nicht gelöscht werden.


Bei: for /f "delims= skip=1" %i in ('dir /b /oN d:\TEMP\test\*.*') do @echo delete %i
würden also alle Ordner bis auf den ersten gelöscht werden?

Beispiel: In "d:\temp\test" sind die Ordner - 0000, 1111 und 2222 enthalen.
So würden doch jetzt alle Ordner bis aus 0000 gelöscht werden?


Vielen Dank für Eure Geduld - Gruß, Koehlo.
Member: Biber
Solution Biber Apr 19, 2016 updated at 15:11:09 (UTC)
Goto Top
Moin koehlo,

mein Beispiel bezog sich auch den Inhalt EINES Ordners und in diesem wollte ich dich an das Löschen aller "Dateien" (nicht Ordner) außer der ersten Datei heranführen.

Ich habe noch nicht die Komplettlösung über den Zaun geworfen, mit der du dieses In-einem-Ordner-alles-löschen-außer auch in einer ganzen Baum-Struktur machen kannst.

Gerade beim Thema "ich will ma' automatisiert und unbeaufsichtigt Dateien löschen" möchte ich schon, dass du das nicht mit einem Copy&Paste-Fundstück aussem Internetz machst.

Bitte erstmal den Schritt 1, 2 und 3:

  • du solltest die FOR/-F- Mimik incl "skip" verstanden haben

  • du solltest mit dem "Lauf-Variablen haben am CMD ein %-Zeichen, im Batch aber 2, also %%" klarkommen

  • du solltest verstanden haben , dass "echo delete meinFotoAlbum" die Worte "delete meinfotoAlbum" auf den Bildschirm schreibt und ein "delete meinFotoAlbum" die einzigen Beweise für Früher-hatte-ich-blonde-Locken unwiderruflich von der Platte fegt.

Solange du da nicht trittsicher bist, brauchen wir nicht weitermachen.

Es sei denn, du willst eine Lösung, von der du nicht weisst, ob und warum sie funktioniert.

Grüße
Biber
Member: koehlo
koehlo Apr 20, 2016 updated at 04:19:46 (UTC)
Goto Top
Hallo Biber,

ne, ne ist schon super so. Im Gegenteil, ich gehe gerne schlauer ins Bett als ich früh aufgestanden bin face-smile
Und das man auf der Platte nicht wüst rumdeleten soll ist mir auch klar.
Wer schon mal die Einschulungsbilder der Tochten gelöscht und sich so den Zorn der ganzen Familie zugezogen hat ... mehr muss ich nicht sagen!


So, OK. Das habe ich soweit verstanden.

for /f "delims= skip=1" %i in ('dir /b /oN d:\TEMP\test\*.*') do @echo delete %i

"for /f "delims=" der Dateisatz besteht aus mehreren Dateisätzen und wird abgearbeitet (geöffnet, gelesen und bearbeitet).
"skip=x" Gibt die Anzahl der Zeilen an, die am Anfang einer Datei übersprungen werden.
"('dir /b /oN d:\TEMP\test\*.*')" Wie, Wo
Mit % und %% komme ich auch soweit zurecht

Ab "do @echo delete %i" ist es noch etwas unklar.

Hier habe ich verstanden, dass das so "auf dem Bildschirm" ausgegeben wird.

Hm, und jetzt? Ich bräuchte nur relativ zeitnah eine Lösung für mein Problem (stehe im Zugzwang beim Kunden)
Grüß, Koehlo.
Member: TlBERlUS
Solution TlBERlUS Apr 20, 2016 at 06:19:07 (UTC)
Goto Top
Guten Morgen,

ist Powershell eine Option für dich?
Member: Biber
Solution Biber Apr 20, 2016 at 16:49:58 (UTC)
Goto Top
Moin koehlo,

sorry, war heute bei anderen Terminen verplant und werf dir jetzt doch nur mal schnell was über den Zaun.
Denn ich hab gleich den nächsten Termin.

Ich hab mal eben deine "G:\Backup"-Struktur simuliert mit ein paar Dummydaten.
D.h. ich hab jetzt dieses zum Spielen:
G:\>dir G:\Backup\*.* /b /s
G:\Backup\1234567
G:\Backup\2345678
G:\Backup\1234567\1234567_01.jpg
G:\Backup\1234567\1234567_02.jpg
G:\Backup\1234567\1234567_03.jpg
G:\Backup\1234567\1234567_04.jpg
G:\Backup\2345678\2345678_01.jpg
G:\Backup\2345678\2345678_02.jpg
G:\Backup\2345678\2345678_03.jpg
G:\Backup\2345678\2345678_04.jpg
G:\Backup\2345678\3456789
G:\Backup\2345678\3456789\3456789_01.jpg
G:\Backup\2345678\3456789\3456789_02.jpg
G:\Backup\2345678\3456789\3456789_03.jpg

Wenn ich jetzt
  • in der Ordnerebene direkt unterhalb "G:\Backup" alle Ordner abklappern wollte
  • und in jeder dieser Verzeichnisebenen alle *.jpg-Dateien löschen wollte außer der alphabetisch ersten

Dann wäre mein proof of concept, meine Testzeile am CMD-Prompt dieses hier mit dem erzeugten Output darunter
G:\>for /d  %d in (G:\backup\*) do @for /f "delims= skip=1" %i in ('dir /b /on /a-D "%d\*.jpg"') do @echo del "%d\%i"
del "G:\backup\1234567\1234567_02.jpg"
del "G:\backup\1234567\1234567_03.jpg"
del "G:\backup\1234567\1234567_04.jpg"
del "G:\backup\2345678\2345678_02.jpg"
del "G:\backup\2345678\2345678_03.jpg"
del "G:\backup\2345678\2345678_04.jpg"

Bitte beachte, dass ich hierbei
  • zwar die gemäß deinen Regeln richtigen Dateien lösche
  • auch NUR Dateien, keine Unterordner
  • aber auch nur die Dateien in der ersten Unterordnerebene ( Inhalt von "G:\backup\2345678\3456789" bleibt unangetastet).

Da war/bin ich mir bei deiner Beschreibung nicht sicher, ob es eine (beliebig tiefe) Unterverzeichnisstruktur gibt.
Den da würde nach Anforderung
  • bei nur einer weiteren Verzeichnisebene halt noch eine FOR /D -Anweisung dazwischensetzen und gut is'
  • bei beliebig tiefer Verzeichnisstruktur eine andere Strategie wählen
  • bei gar keinen tieferliegenden Verzeichnissen mich einfach in den Schatten setzen und alles so lassen as is.

Funktional macht der Oneliner am CMD-Prompt jedenfalls das, was er soll (außer einem @echo del whatever statt dem "echten" del whatever ).

Wenn das funktional deinem Kunden genügt, dann transformier die Zeile in einen Batch.
Also alle einfachen %-Zeichen in doppelte (%%) umwandeln und die eine Onelinerzeile ein bisschen optisch gefälliger in 5 oder 6 Zeilen zerlegen.

Eventuell hab ich ab morgen abend etwas mehr Luft, bis dahin viel Glück
Biber

P.S. BTW, wenn du hier mit der Forumssuchfunktion nach "Dateien löschen außer" (oder ähnlich) suchst, solltest du auch ein paar CMD-Bätche mit dieser Mimik finden.
Member: koehlo
koehlo Apr 21, 2016 at 06:40:31 (UTC)
Goto Top
Hallo Biber,

erst mal vielen Dank für die sehr ausführliche Beschreibung und Erklärung.
Auch ich war bis gestern Abend in Terminen, so kann ich mir das erst heute im laufe des Tages anschauen.

Ich werde mich noch einmal melden.

P.S.: Nein, es gibt keine weiteren Unterordner.


Danke und Gruß, Koehlo.
Member: koehlo
koehlo Apr 21, 2016 at 06:43:09 (UTC)
Goto Top
Hallo Tiberius,

ne, leider nicht.
Aber man kann ja nicht wissen was noch so ansteht.
Vielleicht ist das dann eine Alternative.

Gruß, Koehlo.
Member: koehlo
koehlo Apr 22, 2016 at 12:20:09 (UTC)
Goto Top
Hallo Biber,

SORRY das ich mich erst heute melde. Ich hatte den A ... voll Arbeit.
Wollte mich janoch einmal melden und Feedback geben.

Hat alles geklappt ES LÄUFT face-smile

Für die Hilfe und Unterstützung möchte ich mich noch einmal bedanken.
VIELEN DANK für die Mühen.
Member: Biber
Biber Apr 22, 2016 at 15:06:51 (UTC)
Goto Top
Moin koehlo,

danke für die Rückmeldung.
Aber so leid es mir tut: du musst dich doch noch 1x anmelden, um den Beitrag auf gelöst zu setzen.

Auch wenn die Woche lang und stressig war, Ordnung muss sein.... face-wink

Ich wünsch dir aber schon mal ein schönes Wochenende

Grüße
Biber
Member: koehlo
koehlo Apr 22, 2016 at 15:19:26 (UTC)
Goto Top
Danke, auch dir ein schickes WE. Koehlo.
Richtig "Ordnung muss ein"