cynix
Goto Top

Batch zum löschen von text dateien x kleinergleich y zeilen

Hallo ich würde gerne wissen wenn ich in einem Ordner mehrere txt dateien habe sozusagen jede zeile (also laut batch delims) zähle und dass auch separat mit jeder txt datei. Wenn er zur nächsten(txt) geht den zählwert wieder auf 0 zurücksetzt, und bevor er zurücksetzt prüft wenn z.B.
 %%i <= 2 (%%i zeilenanzahl von aktueller *.txt)
soll die gerade gezählte txt datei gelöscht werden (nicht nur die zeilen).

ich habe folgenden ansatz gefunden komme aber trotzdem nicht ganz weiter:

batch zeilen einer txt zählen und als variable speichern.

schon wenn ich bei dem beispiel die
 blabla.txt mit *.txt 
ersetze meckert cmd herum das irgendwas mit der syntax nicht sitmmt.

Würde mich über Antworten freuen. Es geht um unnötige logs die keinen wirklichen inhalt haben bis auf meta infos die mich nicht interresieren und eben mit 2 zeilen meine workstation zumüllen. dann gibt es aber auch welche mit 3 zeilen was man ja an der KB zahl nicht sehen kann und die zeilenzeichenlänge können evtl auch abweichen.

mfg Cynix

Content-Key: 188550

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

Printed on: April 25, 2024 at 12:04 o'clock

Member: Sheogorath
Sheogorath Jul 25, 2012 at 07:53:46 (UTC)
Goto Top
Halloechen,

Nun, die loesung war schon fast da, ich habe etwas den syntax angepasst, und schon konnte es losgehen. Ich habe imprinzip jetzt alles kommplett... nurnoch limit setzten (anzahl der zeilen, die die datei haben soll) und du kannst starten

@echo off
:config
SET Limit=20


:main
FOR /R %%I IN (*.txt) DO set "datei=%%I" && call :lines_count  
goto finish




:Lines_count
FOR /F "delims=:" %%V IN ('findstr /N .* "%datei%"') DO set zeilen=%%V && call :delete  
goto :eof

:delete
IF %Zeilen% LSS %limit% del "%datei%"  
goto :eof





:finish
exit

Viel Spass

Gruss
Chris
Member: bastla
bastla Jul 25, 2012 at 10:27:37 (UTC)
Goto Top
... wobei vielleicht noch anzumerken wäre, dass mit "FOR /R" auch Dateien in Unterordnern erfasst werden ...

Grüße
bastla
Member: pieh-ejdsch
pieh-ejdsch Jul 25, 2012 updated at 13:34:03 (UTC)
Goto Top
moin,

warum macht Ihr immer sowas Ellenlanges?

Test in der CMD-Line:
for %i in (D:\Log\*.log) do @find /c /v "" <%i |findstr /rxc:"." /c:"[123]." &&echo del "%~i"  

Löscht alle Logdateien mit weniger als 40 Zeilen.

Gruß Phil
Member: cynix
cynix Jul 25, 2012 at 13:48:12 (UTC)
Goto Top
Hey leute danke für eure hilfe die 2. Lösung versteh ich allerdings nicht ganz ? wo zählt er da bis 40 ? bzw.
Bei der ersten lösung versteh ich es so dass x <= limit (also 20) / oder ist x < limit mit lss gemeint ?
Member: pieh-ejdsch
pieh-ejdsch Jul 25, 2012 updated at 14:16:34 (UTC)
Goto Top
moin cynix,

FIND gibt einfach nur die Zeilenanzahl aus, wenn die Datei als EingabeUmleitung erfolgt.
FINDSTR sucht nach /regulären Ausdrücken auf der ganzen /x Zeile.
Damit nach mehreren Werten gesucht werden kann (größer als 9) benutzt Du /c:"Zeichenfolge".

Ein Punkt alleine entspräche hier auch /C:"[0-9]" als regulärer Ausdruck.
Und bei Werten über den Einer Hinaus ist der reguläre Ausdruck für jeden Einzelnen Zehner bis 5x
findstr /rxc:"." "1." /c:"2." /c:"3." /c:"4." /c:"5."

oder auch
findstr /rxc:"." /c:"[1-5]."
jede Suche /c:"Wert" entspricht einem OR

Die CMD-Zeile muss zwar erstmal geschrieben werden, aber ist bei richtiger Anwendung auch schneller Fertig.

Mehr dazu unter Findstr /?

Gruß Phil
Member: bastla
bastla Jul 25, 2012 updated at 17:05:43 (UTC)
Goto Top
... oder anders formuliert:
findstr /rxc:"." /c:"[1-5]."
findet alle Strings (= die ganze von "find /c" gelieferte Zeilenanzahl), die nur aus einem Zeichen oder aus zwei Zeichen, von denen das erste im Bereich der Ziffern 1 bis 5 liegt und das zweite egal ist, bestehen - daher würden damit alle Zahlenwerte von 0 bis 59 gefunden (wenn's nur von 0 bis 39 gehen soll, eben, wie oben "[1-3].") - damit nicht auch zB "155" gefunden wird, gibt "/x" vor, dass die Übereinstimmung für die gesamte Zeile (= Zahl) zu gelten hat.

Grüße
bastla
Member: Sheogorath
Sheogorath Jul 26, 2012 at 06:41:39 (UTC)
Goto Top
Hallo cynix,

Bei meiner Loesung war "x < limit" LSS ist < | <= ist LEQ.

was uebersichtstechnisch, aus meiner Sicht, relativ gut ist, ist
http://de.wikibooks.org/wiki/Batch-Programmierung:_Batch-Befehle
kann man ein bisschen schauen, zumindest fuer kleinere Aufgaben ;)


Gruss
Chris