Dateien in verschiedenen Verzeichnissen löschen, nachdem im Originalverzeichnis diese entfernt wurden
Guten Abend zusammen,
ich benötige einen Denkanstoß bzw. eine Idee, wie ich folgendes Problem lösen kann.
Es wird langsam Zeit, mal wieder das Fotoverzeichnis aufzuräumen. Bisher habe ich das manuell erledigt. Nun soll mir ein kleines Script dabei helfen. Folgende Struktur liegt vor:
\Fotos
\Fotos\originale
\Fotos\bmp
\Fotos\jpg
\Fotos\tiff
... usw.
Alle Fotos kommen ins Unterverzeichnis \originale. Von Zeit zu Zeit bearbeite ich diese mit diversen Programmen. Diese bearbeiteten Fotos werden dann, je nach Programm / Endung in andere Unterverzeichnisse gespeichert. Es kann also z. B. unter \originale\geb_micha_01.jpg liegen und unter \bmp\geb_micha_01.bmp, unter \jpg\geb_micha_01.jpg usw.
D.h. es gibt in den verschiedenen Unterverzeichnissen gleichnamige Dateien mit verschiedenen Endungen.
Die Dateien unter \originale werden regelmäßig gesichert und nach einer bestimmten Zeit gelöscht.
Nun möchte ich ein Script erstellen, dass in allen anderen Unterverzeichnissen die Dateien löscht, die unter \originale nach der Sicherung gelöscht wurden.
Ich hoffe, ich habe mich nicht zu umständlich ausgedrückt.
Grüße
mag-lion
ich benötige einen Denkanstoß bzw. eine Idee, wie ich folgendes Problem lösen kann.
Es wird langsam Zeit, mal wieder das Fotoverzeichnis aufzuräumen. Bisher habe ich das manuell erledigt. Nun soll mir ein kleines Script dabei helfen. Folgende Struktur liegt vor:
\Fotos
\Fotos\originale
\Fotos\bmp
\Fotos\jpg
\Fotos\tiff
... usw.
Alle Fotos kommen ins Unterverzeichnis \originale. Von Zeit zu Zeit bearbeite ich diese mit diversen Programmen. Diese bearbeiteten Fotos werden dann, je nach Programm / Endung in andere Unterverzeichnisse gespeichert. Es kann also z. B. unter \originale\geb_micha_01.jpg liegen und unter \bmp\geb_micha_01.bmp, unter \jpg\geb_micha_01.jpg usw.
D.h. es gibt in den verschiedenen Unterverzeichnissen gleichnamige Dateien mit verschiedenen Endungen.
Die Dateien unter \originale werden regelmäßig gesichert und nach einer bestimmten Zeit gelöscht.
Nun möchte ich ein Script erstellen, dass in allen anderen Unterverzeichnissen die Dateien löscht, die unter \originale nach der Sicherung gelöscht wurden.
Ich hoffe, ich habe mich nicht zu umständlich ausgedrückt.
Grüße
mag-lion
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 201851
Url: https://administrator.de/forum/dateien-in-verschiedenen-verzeichnissen-loeschen-nachdem-im-originalverzeichnis-diese-entfernt-wurden-201851.html
Ausgedruckt am: 23.12.2024 um 04:12 Uhr
6 Kommentare
Neuester Kommentar
Hallo mag-lion!
Sollte (ungetestet) etwa so zu machen sein:
Wegen des "
Grüße
bastla
Sollte (ungetestet) etwa so zu machen sein:
@echo off & setlocal
set "Basis=D:\Fotos"
for %%i in (bmp jpg tiff) do for %%a in ("%Basis%\*.%%i") do if not exist "%Basis%\originale\%%~na.jpg" echo del "%%a"
pause
echo
" vor dem "del
" wird (zum Testen) das Löschen durch Ausgabe des Löschbefehls nur simuliert - wenn Du das "echo
" entfernst, wird tatsächlich gelöscht.Grüße
bastla
Hallo mag-lion!
Um weitere Unterordner einzubeziehen ließe sich natürlich auch eine Schleife für alle Unterordner von "%Basis%" verwenden, wobei der Ordner "originale" übersprungen werden müsste, also etwa:
- Nachteil hier: Es kann nicht mehr auf den Dateityp geprüft werden (da dieser nicht mit dem Ordnernamen übereinstimmt, sondern zB in "web" vermutlich "jpg" sein wird), sondern es werden alle Dateien im jeweiligen Unterordner verarbeitet - wenn sich nur Bilder darin befinden, wäre das aber kein Problem.
BTW: Wie bereits oben erwähnt, würde "
Grüße
bastla
Eine Frage habe ich zu dem "%~na" - ich kenne bei denen, die mit "n" anfangen: "%~n0", "%~nx0" und "%~npx0", aber wofür steht das "a"?
Das ist die Schleifenvariable - "%~n0" bezieht sich auf die Batchdatei oder als "%~n1" auf den ersten Aufrufparameter ...Um weitere Unterordner einzubeziehen ließe sich natürlich auch eine Schleife für alle Unterordner von "%Basis%" verwenden, wobei der Ordner "originale" übersprungen werden müsste, also etwa:
for /d %%i in ("%Basis%\*") do if /i "%%~nxi" neq "originale" for %%a in ("%%i\*.*") do if not exist "%Basis%\originale\%%~na.jpg" echo del "%%a"
Meine erste Überlegung war, alle Dateinamen aus \originale ohne Endung "%~n0" in eine temporäre Datei zu speichern und diese dann mit einer Schleife über die anderen Unterverzeichnisse laufen zu lassen, wobei alle Dateien, welche nicht darin stehen aus diesen Unterverzeichnissen gelöscht werden.
Ginge natürlich auch - Du müsstest aber weiterhin für jede einzelne Datei den Namen ohne Typ bestimmen und dann zusätzlich per "findstr
" prüfen, ob dieser Name in der Liste enthalten ist - schneller dürfte das (durch den jeweils erforderlichen Aufruf der "findstr.exe
") im Vergleich zum internen "if exist
" eher nicht sein ...BTW: Wie bereits oben erwähnt, würde "
%~n0
" den Namen der Batch-Datei selbst liefern.Grüße
bastla
Hallo mag-lion!
Dann würde ich etwa so vorgehen:
Das als Begrenzungszeichen verwendete "#" sollte nicht in den Ordnernamen enthalten sein und kann ggf auch durch zB "§" oder andere Sonderzeichen, die in Batch keine besondere Bedeutung haben, ersetzt werden.
Das "
Grüße
bastla
Dann würde ich etwa so vorgehen:
for /d %%i in ("%Basis%\*") do echo #originale#das nicht#das auch nicht#|findstr /ic:"#%%~nxi#">nul || for %%a in ("%%i\*.*") do if not exist "%Basis%\originale\%%~na.jpg" echo del "%%a"
Das "
findstr
" nur einmal je Ordner aufgerufen werden muss, sollte die Performance auch nicht wirklich leiden.Grüße
bastla