Daten unterhalb eines Verzeichnisses löschen?

German support forum

Moderators: Hacker, Stefan2, white

User avatar
Peter
Power Member
Power Member
Posts: 2068
Joined: 2003-11-13, 13:40 UTC
Location: Schweiz

Daten unterhalb eines Verzeichnisses löschen?

Post by *Peter »

Guten Tag

folgendes Problem (bzw. Aufgabe):

Ich habe die Verzeichnisse

c:\heute
c:\morgen

beide haben diversen Inhalt. Jetzt möchte ich den Inhalt der Verzeichnisse löschen, aber die Verzeichnisse stehen lasssen.

mühselige Lösung 1:
gehe nach heute hinein - markiere und lösche alles - gehe zurück - gehe nach morgen hinein - markiere und lösche alles - gehe zurück.
Funktioniert, ist aber lange Klickerei.

Nicht-Lösung 2:
Markiere heute und morgen - lösche.
Funktioniert nicht, weil auch heute und morgen verschwinden.

Gibt es elegantere Methoden?

danke im voraus.

Peter
TC 10.xx / #266191
Win 10 x64
User avatar
ghisler(Author)
Site Admin
Site Admin
Posts: 50650
Joined: 2003-02-04, 09:46 UTC
Location: Switzerland
Contact:

Post by *ghisler(Author) »

Wenn das die einzigen Verzeichnisse an diesem Ort sind, dann einfach Strg+B drücken (Zweigansicht) und die Dateien löschen. Die Verzeichnisse bleiben dann übrig.
Author of Total Commander
https://www.ghisler.com
User avatar
Peter
Power Member
Power Member
Posts: 2068
Joined: 2003-11-13, 13:40 UTC
Location: Schweiz

Post by *Peter »

ghisler(Author) wrote:Wenn das die einzigen Verzeichnisse an diesem Ort sind ..
Leider nein. "Heute" und "Morgen" haben auch Unterverzeichnisse, die nicht bleiben dürfen, sondern weg müssen.

Peter
TC 10.xx / #266191
Win 10 x64
User avatar
RID500
Member
Member
Posts: 194
Joined: 2006-11-20, 12:38 UTC

Post by *RID500 »

Hilft dir eine Batchdatei?

Code: Select all

@ECHO OFF
C:
CD \
CD heute
ECHO Entferne das REM in der naechsten Zeile wenn du weißt was du machst.
REM rd /s/q
ECHO Der Inhalt des Ordners heute wurde entfernt

CD \
CD morgen 
ECHO Entferne das REM in der naechsten Zeile
REM rd /s/q
ECHO Der Inhalt des Ordners morgen wurde entfernt
PAUSE
Das ist nur mal so in den Raum geworfen. Bitte vor der Benutzung testen.
/join #TCMD Chat at irc.freenode.net - Today's newbies are tomorrow's experts.
User avatar
Peter
Power Member
Power Member
Posts: 2068
Joined: 2003-11-13, 13:40 UTC
Location: Schweiz

Post by *Peter »

RID500 wrote:Hilft dir eine Batchdatei?...
Dachte ich auch, aber ein paar Details scheinen zu ärgern.

Das "rd" braucht eine exakte Verzeichnisangabe und schluckt nicht "alles".
Ein "cd heute" mit "del *.* /s /f /q" lässt die Verzeichnisse stehen ...

Jetzt denke ich, dass die "Ansicht Verzeichnisbaum" eine passable Navigation bietet ..

Peter
TC 10.xx / #266191
Win 10 x64
User avatar
Kosch
Member
Member
Posts: 134
Joined: 2004-04-25, 13:38 UTC

Post by *Kosch »

vielleicht hilft ein autohotkey script...
http://de.autohotkey.com/
User avatar
DeeDee
Member
Member
Posts: 155
Joined: 2005-08-13, 12:00 UTC

Post by *DeeDee »

Wenn Batch, dann vielleicht auf diese Art und Weise:

Code: Select all

@echo off
deltree /y c:\heute\*.*
deltree /y c:\morgen\*.*
User avatar
Peter
Power Member
Power Member
Posts: 2068
Joined: 2003-11-13, 13:40 UTC
Location: Schweiz

Post by *Peter »

Code: Select all

´deltree´is not recognized as an internal or external command,
operable program or batch file.
Peter
TC 10.xx / #266191
Win 10 x64
icfu
Power Member
Power Member
Posts: 6052
Joined: 2003-09-10, 18:33 UTC

Post by *icfu »

DELTREE gibt's nur unter WinDOS. Unter NT ist es RD (RMDIR), was bereits erwähnt wurde.

Um selektiv Unterverzeichnisse zu löschen, bedarf es einer FOR-Schleife, alternativ kann man auch die ACLs der nicht zu löschenden Verzeichnisse entsprechend modifizieren und dann RD verwenden.

Icfu
This account is for sale
User avatar
karlchen
Power Member
Power Member
Posts: 4605
Joined: 2003-02-06, 22:23 UTC
Location: Germany

Post by *karlchen »

Hi,

habe mir erlaubt, RID500s Idee aufzugreifen und ein wenig zu erweitern.

Code: Select all

@ECHO OFF
:: Programm: wegdamit.cmd
:: Idee     : RID500
:: Erweitert: Karlchen
C:
CD \heute
:: Achtung: der Vergleich achtet auf Gross/Kleinschreibung!
if "%CD%"=="C:\heute" (
  ECHO Entferne die REMs in den naechsten Zeile wenn du weißt was du machst.
  :: Loesche alle Dateien ohne Fragen rekursiv
  REM del *.* /f /s /q
  :: Loesche die Unterverzeichnisse rekursiv ohne Fragen
  REM for /d %%a in (*.*) rd %%a /s /q
  ECHO Der Inhalt des Ordners heute wurde entfernt
)
else (
  echo Bin nicht im Verzeichnis C:\heute, sondern in %CD%
)

CD \morgen 
:: Achtung: der Vergleich achtet auf Gross/Kleinschreibung!
if "%CD%"=="C:\morgen" (
  ECHO Entferne die REMs in den naechsten Zeile wenn du weißt was du machst.
  :: Loesche alle Dateien ohne Fragen rekursiv
  REM del *.* /f /s /q
  :: Loesche die Unterverzeichnisse rekursiv ohne Fragen
  REM for /d %%a in (*.*) rd %%a /s /q
  ECHO Der Inhalt des Ordners morgen wurde entfernt
) else (
  echo Bin nicht im Verzeichnis C:\morgen, sondern in %CD%
)
PAUSE
Grüße,
Karl
User avatar
sqa_wizard
Power Member
Power Member
Posts: 3893
Joined: 2003-02-06, 11:41 UTC
Location: Germany

Post by *sqa_wizard »

Dann setzte ich noch einen drauf: Alle markierten Verzeichnisse werden geleert !

Im TC bitte einen Button anlegen mit:

Kommando= wegdamit.cmd
Parameter= %S
Tooltip= Markierte Verzeichnisse leeren

Code: Select all

:: Programm: wegdamit.cmd
:: Idee     : RID500
:: Erweitert: Karlchen
:: TC intern: sqa_wizard

:: Markierte Verzeichnisse (als Parameter uebergeben) werden geleert
:: Syntax: wegdamit [dir1] [dir2] ... [dir9]

@ECHO OFF
FOR %%d IN ( %* ) DO (
	:: Sicherheitshalber noch mal Existenz testen !
	IF EXIST %%d (
	  CD %%d
     ECHO ... %%d wird geleert
	  REM Entferne die REMs in den naechsten Zeile wenn du weißt was du machst.
	  :: Loesche alle Dateien ohne Fragen rekursiv
	  REM del *.* /f /s /q
	  :: Loesche die Unterverzeichnisse rekursiv ohne Fragen
	  REM for /d %%a in (*.*) rd %%a /s /q
	  ECHO Der Inhalt des Ordners %%d wurde entfernt
     REM ... und wieder zum Ausgangs-Verzeichnis
     CD ..
	)
)
PAUSE
#5767 Personal license
User avatar
Dalai
Power Member
Power Member
Posts: 9990
Joined: 2005-01-28, 22:17 UTC
Location: Meiningen (Südthüringen)

Post by *Dalai »

Wenn ich alles richtig verstanden habe, geht das auch viel kürzer:

Code: Select all

REM   erst alles löschen
if exist c:\heute rd /s /q C:\heute
if exist c:\morgen rd /s /q C:\morgen

REM  dann die obersten Verzeichnisse neu anlegen
md c:\heute
md c:\morgen
Ist natürlich nur dann sinnvoll, wenn man die Attribute der beiden Verzeichnisse nicht für Synchronisation o.ä. benötigt.
Wenn die Attribute (und evtl. die NTFS-Rechte) egal sind, dann ist es so viel kürzer.

OK, die Idee von RID500, Karlchen und sqa_wizard ist natürlich universell einsetzbar, da durch Parameter steuerbar. Muss man aber aufpassen, dass man nicht zuviel löscht :-)
Deswegen hier eine kleine Erweiterung:

Code: Select all

@ECHO OFF
:: Programm: wegdamit.cmd
:: Idee     : RID500
:: Erweitert: Karlchen
:: TC intern: sqa_wizard

:: Markierte Verzeichnisse (als Parameter uebergeben) werden geleert
:: Syntax: wegdamit [dir1] [dir2] ... [dir9]

echo.
echo Sie stehen im Vezeichnis
echo %CD%.
echo.
echo Folgende Verzeichnisse wirklich loeschen?
echo %*
echo.
set /p erase=Ihre Eingabe (j/n):
if [%erase%]==[j] goto loesche
goto :EOF

:loesche
FOR %%d IN ( %* ) DO (
   :: Sicherheitshalber noch mal Existenz testen !
   IF EXIST %%d (
     CD %%d
     ECHO ... %%d wird geleert
     REM Entferne die REMs in den naechsten Zeile wenn du weißt was du machst.
     :: Loesche alle Dateien ohne Fragen rekursiv
     REM del *.* /f /s /q
     :: Loesche die Unterverzeichnisse rekursiv ohne Fragen
     REM for /d %%a in (*.*) rd %%a /s /q
     ECHO Der Inhalt des Ordners %%d wurde entfernt
     REM ... und wieder zum Ausgangs-Verzeichnis
     CD ..
   )
)
PAUSE
Wenn man die Verzeichnisliste untereinander haben will, dann so:

Code: Select all

for %%i in (%*) do echo %%i
statt einfach

Code: Select all

echo %*
MfG Dalai
#101164 Personal licence
Ryzen 5 2600, 16 GiB RAM, ASUS Prime X370-A, Win7 x64

Plugins: Services2, Startups, CertificateInfo, SignatureInfo, LineBreakInfo - Download-Mirror
StatusQuo
Power Member
Power Member
Posts: 1524
Joined: 2007-01-17, 21:36 UTC
Location: Germany

Post by *StatusQuo »

An alle bisherigen Mitgestalter: Nette Batch!
Meine Ergänzungen dazu:
  • beim del kann "/s" zur Zeitersparnis entfallen, Dateien in Unterverzeichnissen werden von rd /s schneller entsorgt
  • mit "/a" entsorgt del zusätzlich auch versteckte und Systemdateien
  • dem CD würde ich sicherheitshalber noch ein "/D" mitgeben, damit ggf. auch das Laufwerk gewechselt wird, falls im Zielparameter angegeben (funktioniert auch, wenn nicht angegeben)
  • das Ergebnis von CD könnte auch eine Prüfung vertragen
    (die Exist-Prüfung gibt auch bei existierender Datei (statt Verzeichnis) OK/wahr zurück - damit würde CD nicht ausgeführt, das Löschen aber schon; Statusmeldungen angepasst)
(Änderungen sind im Code unten eingetragen.)
sqa_wizard wrote:Dann setzte ich noch einen drauf: Alle markierten Verzeichnisse werden geleert !

Im TC bitte einen Button anlegen mit:

Kommando= wegdamit.cmd
Parameter= %S
Tooltip= Markierte Verzeichnisse leeren

Code: Select all

:: Programm: wegdamit.cmd
:: Idee     : RID500
:: Erweitert: Karlchen, Dalai, StatusQuo
:: TC intern: sqa_wizard

:: Markierte Verzeichnisse (als Parameter uebergeben) werden geleert
:: Syntax: wegdamit [dir1] [dir2] ... [dir9]

@ECHO OFF
echo.
echo Sie stehen im Vezeichnis
echo %CD%.
echo.
echo Folgende Verzeichnisse wirklich loeschen?
echo %*
echo.
set /p erase=Ihre Eingabe (j/n):
if [%erase%]==[j] goto loesche
goto :EOF

:loesche
set erase=
FOR %%d IN ( %* ) DO (
   :: Sicherheitshalber noch mal Existenz testen !
   IF EXIST %%d (
      CD /D %%d
      if not errorlevel 1 (
         ECHO ... %CD% wird geleert
         REM Entferne die REMs in den naechsten Zeile wenn du weißt was du machst.
         :: Loesche alle Dateien ohne Fragen
         REM del *.* /f /q
         :: oder alternativ: inklusive versteckte + Systemdateien:
         REM del *.* /f /a /q
         :: Loesche die Unterverzeichnisse rekursiv ohne Fragen
         REM for /d %%a in (*.*) rd %%a /s /q
         ECHO ... %CD%: Der Inhalt dieses Ordners wurde entfernt
         REM ... und wieder zum Ausgangs-Verzeichnis
         CD ..
      )
   )
)
PAUSE
Who the hell is General Failure, and why is he reading my disk?
-- TC starter menu: Fast yet descriptive command access!
StatusQuo
Power Member
Power Member
Posts: 1524
Joined: 2007-01-17, 21:36 UTC
Location: Germany

Post by *StatusQuo »

Dalai wrote:Wenn ich alles richtig verstanden habe, geht das auch viel kürzer:

Code: Select all

REM   erst alles löschen
if exist c:\heute rd /s /q C:\heute
if exist c:\morgen rd /s /q C:\morgen

REM  dann die obersten Verzeichnisse neu anlegen
md c:\heute
md c:\morgen
Ist natürlich nur dann sinnvoll, wenn man die Attribute der beiden Verzeichnisse nicht für Synchronisation o.ä. benötigt.
Ja, das setzt allerdings voraus, dass die beiden obersten Verzeichnisse nicht dauerhaft und/oder gleichzeitig von einem anderen Programm benutzt/blockiert werden. Sonst können sie entweder nicht gelöscht werden (weil geblockt) oder sollten es nicht, damit das andere Programm nicht ins Leere greift.
Who the hell is General Failure, and why is he reading my disk?
-- TC starter menu: Fast yet descriptive command access!
User avatar
Peter
Power Member
Power Member
Posts: 2068
Joined: 2003-11-13, 13:40 UTC
Location: Schweiz

Post by *Peter »

Guten Morgen

da läuft ja einiges - danke für die vielen Beiträge.

Mangels Zeit und richtigem PC kann ich nicht im Detail nacharbeiten, aber etwas muss ich konkretisieren:

- Die Verzeichnisse liegen natürlich nicht alle im gleichen Pfad; da war mein Beispiel etwas zu einfach . Sie liegen auf verschiedenen Pfaden, und daher muss der ganze Ablauf nicht absolute, sondern relative Pfade haben.

- Es gibt insgesamt 5 Verzeichnisnamen, die es geben kann, die aber nicht immer vorhanden sind.

Bsp.:

Code: Select all

c:\testa\testb\heute
c:\testa\testb\morgen
c:\testa\testb\übermorgen

c:\testx\heute
c:\testx\morgen
c:\testx\gestern
c:\testx\vorgestern

Ablauf:
- Der Anwender geht ins Zielverzeichnis, z.B. c:\testa\testb. Das geht händisch, nicht automatisch.
- Im Zielverzeichnis werden die vorhandenen Verzeichnisse gelöscht. Ob man die vorhandenen Verzeichnisse mit "if exist" prüft oder im TC markiert und dann startet - das sehe ich offen.
Die Idee oben, auch die Verzeichnisse zu löschen und dann automatisch anzulegen (aber nur die vorher gelöschten), ist grundsätzlich gut, verändert aber das Datum des Verzeichnisses. Ob das wirklich auch wichtig ist weiß ich momentan selber nicht.

Peter
TC 10.xx / #266191
Win 10 x64
Post Reply