buxi
Goto Top

Dateien aus best. Verzeichnis mit der Grösse 0 KB löschen

Datei Löschscript für Dateien mit weniger als 1 kB oder genau 0 KB

Hallo liebes Administratoren.de-Team,

ich habe folgende Frage:
Wie kann ich unter Windows NT4/2000/Xp/2003 mit den Bordmitteln (Kommandozeile)
dieses Problem lösen.
Es sollen in einem bestimmten Verzeichnis die Dateien mit einer Grösse von 0 (KB, B) ermittelt und dann gelöscht werden.
Vieleicht ist es auch leichter, zu definieren Dateien mit weniger als 1 (KB,B) ?
Mit DIR kann ich nur sortieren und anzeigen lassen.

Danke für eure Unterstützung vorab.

Gruß
Buxi

Content-Key: 39829

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

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

Member: Metzger-MCP
Metzger-MCP Sep 11, 2006 at 11:13:51 (UTC)
Goto Top
Du kannst das mit einer Batchdatei lösen.

Verzeichnisse größensortiert mit dem dir Befehl in eine Txt Datei schreiben.
Aus dieser Datei kannst du dann die 0KB Biester mit einer Forschleife extrahieren
in eine 2. TXT. Im Anschluß kannst du mit einer Forschleife die Datein löschen.

Da kann ich dir aber auch eine fertige Batchdatei zusenden geben.

MFG Metzger

Edit

Datei inhalt ohne Gewähr.
@echo off
echo. > dir1.txt
echo. > dir2.txt
echo. > dir3.txt
dir /OGS *.* > dir1.txt
for /F "eol=; tokens=1,2,3,4* delims= " %%i in (dir1.txt) do echo %%k %%l >> dir2.txt
for /F "eol=; tokens=1,2,3,4* delims= " %%i in (dir2.txt) do if /i %%i EQU 0 echo %%i %%j >> dir3.txt

rem for /F "eol=; tokens=1,2,3,4* delims= " %%i in (dir2.txt) do if /i %%i EQU 0 echo %%j >> dir3.txt
rem for /F "eol=; tokens=1,2,3,4* delims= " %%i in (dir3.txt) do del %%i

So wie die Datei oben ersichtlich ist, protokoliert sie in DIR3.txt alle Datein die gelöscht werden würden.

Wird vor der 2te Forschleife ein rem gesetzt und bei den unteren beiden Rem entfernt, so löscht sie alle 0KB augenblicklich. Die Protokolierung bleibt erhalten.
Member: Biber
Biber Sep 11, 2006 at 11:15:49 (UTC)
Goto Top
Moin buxi,

vom CMD-Prompt aus:

@for /R D:\temp\Backup1 %i in (*.*) do @if %~zi==0 del %i
...würde alles im Verzeichnis D:\temp\Backup1 und darunter löschen, was 0-Byte-Größe hat.
Wenn Du nicht in allen Verzeichnissen unterhalb löschen willst, musst Du noch eine Zusatzbedingung anhängen, ob denn die gefundene Datei auch im Verzeichnis, das vorn in der ersten Klammer steht, gefunden wurde.

@for /R D:\temp\Backup1 %i in (*.*) do @if %~zi==0 if /i %~dpi==D:\temp\Backup1\ del %i

Als Batch mit einem Parameter "NameDesVerzeichnisses" sähe das so aus:
::-------snipp Del0Files.bat
@for /R %1 %%i in (*.*) do @if %%~zi==0 @if /i [%%~dpi]==[%1\] echo del %%i 
Richtigerweise würde der Oneliner bei mir folgende 0-Byte-Datei finden:
>f:\Del0Files.bat d:\temp\Backup1
del d:\temp\Backup1\AdobeWeb.log
Zum Test macht der Batch nur ein "echo del ..." ; zum Scharfmachen das Wort "echo" löschen.


Gruß
Biber
Member: buxi
buxi Sep 11, 2006 at 15:03:30 (UTC)
Goto Top
Hallo Biber,

habe den 3. Teil ( mit Parameterübergabe )deiner Batch-Exkursion ausprobiert. Dieser funktioniert.
Leider bekomme ich bei Ausführung der 2. Batch :
@for /R D:\temp\Backup1 %i in (*.*) do @if %~zi==0 if /i %~dpi==D:\temp\Backup1\ del %i
folgende Fehlermeldung:
Die folgende Verwendung des Pfadoperators zur Ersetzung eines Batchparameters
ist ungültig: %~dpi==D:\temp\Backup1\ del %i
Hast Du eine zündende Idee ?
Ich habe mir die FOR-Synthax angeschaut (muss mich allerdings noch etwas damit beschäftigen) und ad-hoc keinen Fehler entdecken können.
Danke Dir für eine Antwort.

Gruß
buxi
Member: Biber
Biber Sep 11, 2006 at 15:34:14 (UTC)
Goto Top
Moin buxi,

ja, ist erklärlich.
Der zweite Oneliner war gar nicht als Batch gedacht, sondern auch noch als Versuch am CMD-Prompt.
Da liefert genau diese Zeile (nur wieder mit "echo del" statt "del" am Ende):
--am CMD-Prompt:--
>@for /R D:\temp\Backup1 %i in (*.*) do @if %~zi==0 if /i %~dpi==D:\temp\Backup1\ echo del %i
del D:\temp\Backup1\AdobeWeb.log
Als Oneliner-Batch müssen alle Zählvariablen (also die %i, %~dpi, %~zi) jewils mit 2 %%-Zeichen geschrieben werden.
Also wäre diese CMD-Anweisung oben als Batch so (siehe unten) zu schreiben:
::---snipp Der2teOneliner.bat
@for /R D:\temp\Backup1 %%i in (*.*) do @if %%~zi==0 if /i %%~dpi==D:\temp\Backup1\ echo del %%i
... aber der wäre ja als Batch zu unflexibel, weil er sich ja immer nur auf das Verzeichnis "D:\temp\Backup1" bezieht.
Deshalb war dann ja als einzige Batch-Variante die 3. Fassung, die mit einem beliebigen Verzeichnis als Parameter herausgekommen.

Gruß
Biber
Member: buxi
buxi Sep 11, 2006 at 15:47:52 (UTC)
Goto Top
Moin Biber, und Metzger face-smile,

danke, danke sehr für die Hilfe. Langsam erschliesst sich mir die FOR-usability.
Werde mich in der nächsten Zeit mal aktiver hier beteiligen - give and take.

Thanks a lot.
Member: buxi
buxi Sep 11, 2006 at 17:31:48 (UTC)
Goto Top
Hallo Biber,

ich habs nochmals durchgetestet.
Kleines Problem jetzt:
Wenn in dem Verzeichnis, in welchem die zu löschenden Dateien liegen,
eine Datei mit einem Leerzeichen z. B. "Neu Worddokument.doc" etc. liegt,
dann bekomme ich eine Fehlermeldung (liegt wohl am Space dazw. ).
f: \Neu konnte nicht gefunden werden
f: \Wordokument.doc konnte nicht gefunden werden.
Diese wird dann nicht gelöscht.
Kann man das elegant umgehen ?
Hochkommatas und /Q funzen da wohl nicht.

Brainstoooorming ..

Gruß
Buxi
Member: Biber
Biber Sep 11, 2006 at 18:49:59 (UTC)
Goto Top
Moin buxi,
ja, das geht noch relativ stressarm.
Einfach das %%i nach dem "del" in Hochkommas setzen.

Aber: --> 2 oder 3 Fälle sind noch nicht abgefangen:
a) es kann ja Pfade mit Leerzeichen im Namen geben. Dazu muss auch der Parameter 1 bzw. die Prüfung leerzeichentauglich gemacht werden
::-------snipp Del0Files.bat
@for /R %1 %%i in (*.*) do @if %%~zi== 0 @if /i "%%~dpi"=="%~1\" @echo del "%%i" 2>nul  

b) Gerade bei diesen 0-Byte-Dateien sind einige "in Gebrauch" oder ReadOnly oder schlicht nicht löschbar. Dazu würde ich noch ans Ende der Zeile ein "2>nul" stellen.
Auf Deutsch: Unterdrücke Fehlermeldungen.

c) okay, Faulheit... ich prüfe ja nicht mal, ob ein Parameter übergeben wurde.
Ist also nicht gerade ein Schnipsel, den ich irgendeinem Uneingeweihten schenken würde.
Dir Prüfung sollte (wenn es als Batch irgendwo gespeichert werden soll) schon rein.


Auch wenn sich dadurch die Zeilenzahl langfristig verdoppeln sollte..
::-------snipp Del0Files.bat
@if not [%1]== @for /R %1 %%i in (*.*) do @if %%~zi== 0 @if /i "%%~dpi"=="%~1\" @echo del "%%i" 2>nul  

Gruß
Biber
P.S. Wer jetzt die ganze Geschichte mitgelesen hat, versteht jetzt eine ganz schön kryptische Batchzeile.
Die dürfte man/frau aber auch normalerweise niemandem vor dem Frühstück anbieten.
Member: Metzger-MCP
Metzger-MCP Sep 12, 2006 at 09:11:50 (UTC)
Goto Top
Gruß
Biber
P.S. Wer jetzt die ganze Geschichte mitgelesen hat, versteht jetzt eine ganz
schön kryptische Batchzeile. Die dürfte man/frau aber auch normalerweise niemandem
vor dem Frühstück anbieten.

face-smile he he ja so ist das ! Wer in den Rechner schaut bevor er ein Muntermacher genommen hat ist selber schuld ! face-smile aber abends ( 21:00 ) ist das ja noch so gerade verdauenbar. face-smile

Dieser kommentar kann gefahrlos überlesen werden.
MFG Metzger