Viele Dateien eines spezifischen Zeitraum anhand des DATEINAMEN suchen/filtern

German support forum

Moderators: white, Hacker, Stefan2

Post Reply
CyberT
Junior Member
Junior Member
Posts: 4
Joined: 2021-06-08, 12:06 UTC

Viele Dateien eines spezifischen Zeitraum anhand des DATEINAMEN suchen/filtern

Post by *CyberT »

Hallo zusammen,

ich habe hier rund 30 monatsbasierte Ordner mit jeweils knapp 45.000 Dateien pro Ordner. Diese Dateien werden automatisiert generiert, 1 Datei pro Minute (was allerdings nicht immer exakt sekundengenau erfolgt).

Die Dateinamen beinhalten einen Zeitstempel und haben das folgende Format:

Code: Select all

Device-01_2021-05-03_17-20-05
Device-01_2021-05-03_17-21-02
Device-01_2021-05-03_17-22-04
Device-01_2021-05-03_17-23-03
Device-01_2021-05-03_17-24-03
[...]
Jetzt möchte ich alle Dateien mit bestimmten Eigenschaften im Dateinamen suchen bzw. herausfiltern, und zwar:
1. Alle Dateien, die zwischen 18:00 und 06:00 Uhr erstellt wurden, möchte ich löschen.
2. Von allen übrigen Dateien (also die von 06:00 bis 18:00 Uhr) soll nur jede 60. Datei behalten werden, also nur 1 Datei je Stunde, alle anderen Dateien möchte ich löschen.

Der Suchvorgang kann gerne in 2 separaten Suchvorgängen erfolgen, muss also nicht in einem Durchgang erledigt werden.

--> Ich kann hier leider nicht das Erstellungsdatum oder Änderungsdatum der Datei heranziehen, da dies vom Datum des eigentlichen/relevanten Zeitstempels im Dateinamen abweicht (durch bereits vorangegangene Kopiervorgänge).

Wie kann ich das mit der Suchfunktion von Total Commander am besten lösen?
Vermutlich werde ich hierbei auf RegEx zurückgreifen müssen und hierzu eine geeignete RegEx-Zeichenkette entwickeln müssen?

Vielen Dank vorab und
Gruß.
User avatar
Stefan2
Power Member
Power Member
Posts: 4133
Joined: 2007-09-13, 22:20 UTC
Location: Europa

Re: Viele Dateien eines spezifischen Zeitraum anhand des DATEINAMEN suchen/filtern

Post by *Stefan2 »

zB mit Powershell.


Aufgabe 1:
"""Alle Dateien, die zwischen 18:00 und 06:00 Uhr erstellt wurden (laut Dateinamen), möchte ich löschen."""
Beispielname: "Device-01_2021-05-03_HH-MM-SS.ext"
GCI dev* | ForEach{ $H=[int]$_.Name.substring(21,2) ; if($H -gt 17 -or $H -lt 7) { $_ } }
Hier fehlt nur noch das abschließende delete


Aufgabe 2:
"""Von allen übrigen Dateien soll nur nur 1 Datei je Stunde behalten werden (laut Dateinamen), alle anderen Dateien möchte ich löschen."""
Kann man denn eine bestimmte Datei pro Stunde genau identifizieren, zB an der Minute 01?
Oder zumindest an einem Zeitraum wie "zwischen Minute 01 und 05" ?
Beispielname: "Device-01_2021-05-03_HH-MM-SS.ext"
Gci dev* | ForEach{ $M=[int]$_.Name.substring(24,2) ; if($M -gt 5) { $_ } }
Auch hier fehlt nur noch der abschließende Löschbefehl DEL und alle Dateien mit Minute größer 5 werden gelöscht.
Eventuell bleiben hier mehrere Dateien pro Stunde erhalten, aber zumindest ist aufgeräumt und das Skript nicht zu kompliziert.
(Aber jede Stunde muss hier eine Datei mit Minute 1-5 haben!)




$H >>> speichert den Stundenteil
$M >>> speichert den Minutenteil




Löschbefehl:
Ändere { $_ } } zu {DEL $_ } }
 
CyberT
Junior Member
Junior Member
Posts: 4
Joined: 2021-06-08, 12:06 UTC

Re: Viele Dateien eines spezifischen Zeitraum anhand des DATEINAMEN suchen/filtern

Post by *CyberT »

Hallo Stefan2,

oh super, vielen Dank.

Stefan2 wrote: 2021-09-16, 09:24 UTC zB mit Powershell.
Okay, hier ist die Windows PowerShell gemeint?

Stefan2 wrote: 2021-09-16, 09:24 UTCKann man denn eine bestimmte Datei pro Stunde genau identifizieren, zB an der Minute 01?
Ja, der Dateiname lautet dann z.B. wie folgt: Device-01_2021-03-05_05-01-24
Es gibt aber auch immer genau 1 Datei zur vollen Stunde, also: Device-01_2021-03-05_05-00-24

Es gibt in der Tat immer exakt 1 Datei pro Minute, die sich anhand des Zeitstempels im Dateinamen eindeutig identifizieren lässt.
Nur die Sekundenangaben im Zeitstempel (die letzten beiden Ziffern) variieren immer mal wieder.

Stefan2 wrote: 2021-09-16, 09:24 UTCOder zumindest an einem Zeitraum wie "zwischen Minute 01 und 05" ?
[...]
Eventuell bleiben hier mehrere Dateien pro Stunde erhalten, [...]
Optimaler wäre es natürlich, wenn ich hier gleich auf 1 Datei pro Stunde reduzieren könnte.


Vielleicht nochmal zur Verdeutlichung: Ich habe hier einen Datenbestand von ca. 1,35 Mio. Dateien, den ich anhand der vorgenannten Kriterien ausdünnen möchte. Je mehr ich hier automatisieren kann (z.B. Suchen/Löschen auch in Unterordnern), desto besser.

Nochmals vielen Dank.
Gruß.



 
User avatar
Stefan2
Power Member
Power Member
Posts: 4133
Joined: 2007-09-13, 22:20 UTC
Location: Europa

Re: Viele Dateien eines spezifischen Zeitraum anhand des DATEINAMEN suchen/filtern

Post by *Stefan2 »

Ja, Windows PowerShell:

CMD DOS- / Powershell-Fenster über Tastaturkürzel aufrufen
viewtopic.php?p=351817#p351817


- - -

Erstelle ein Backup deines Ordners
und dann öffne eine PowerShell-Konsole in deinem Ordner(*) und probiere diese beiden Befehle aus:
Beispielname: "Device-01_2021-05-03_HH-MM-SS.ext"
GCI dev* | ForEach{ $H=[int]$_.Name.substring(21,2) ; if($H -gt 17 -or $H -lt 7) { $_ } } | Out-File _testlauf1LoescheRuheStunden.txt -Width 999
Gci dev* | ForEach{ $M=[int]$_.Name.substring(24,2) ; if($M -gt 1) { $_ } } | Out-File _testlauf2LoescheMinutenAlleAusserMinute1.txt -Width 999

Dies erstellt je eine Textdatei mit Dateinamen, welche gelöscht werden würden.

Es wird nicht überprüft, ob für jede Stunde eine Datei übrig bleibt, es werden nur stur alle Dateien mit Minute 01 übersprungen (somit nicht gelöscht).

Änderungsmöglichkeit Minuten:
-gt 1 >>> alles außer zB "Device-01_2021-03-05_05-01-24" (und 05-00-24)
-gt 0 >>> alles außer zB "Device-01_2021-03-05_05-00-24"

Erklärung:
$H >>> speichert den Stundenteil
$M >>> speichert den Minutenteil


* die Konsole muss den Pfad zu deinem Ordner zeigen, zB:
PS C:\Temp\Test>
Die eingangs erwähnte FAQ zeigt wie man eine PoSh-Konsole über den TC aufruft, wobei dann der Arbeitspfad vom TC bereits eingestellt wurde.



- - -


Wenn das passt, kannst du den Löschbefehl hinzufügen:
Ändere { $_ } } zu {DEL $_ } }

GCI dev* | ForEach{ $H=[int]$_.Name.substring(21,2) ; if($H -gt 17 -or $H -lt 7) { DEL $_ } }
Gci dev* | ForEach{ $M=[int]$_.Name.substring(24,2) ; if($M -gt 1) { DEL $_ } }




- - -


Solche Befehle kannst du auch als Button anlegen:

Code: Select all

TOTALCMD#BAR#DATA
PowerShell -NoExit
GCI dev* | ForEach{ $H=[int]$_.Name.substring(21,2) ; if($H -gt 17 -or $H -lt 7) { $_ } } | Out-File _testlauf1LoescheRuheStunden.txt -Width 999
C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe
hier deine Beschreibung

1
-1
Austauschbarer Button-Code:
Anwendung: markiere den Code, kopiere ihn ins Clipboard, dann Rechtsklick auf die TC Buttonbar und wähle "Einfügen".

Da der Startpfad frei bleibt, nimmt der TC den jeweils aktiven Ordner als Arbeitsverzeichnis.
Das "_noexit" kann auch weggelassen werden, um das Fenster am Ende zu schließen.




FAQs: Button-code kopieren einfügen (TOTALCMD#BAR#DATA)
viewtopic.php?p=335758#p335758

FAQs: Button anlegen / Buttonbar erstellen / Icons / Variable / Anführungszeichen
viewtopic.php?p=342115#p342115





 
Post Reply