buffalos-bar
Goto Top

Sortieren von Dateien über mehrere (Unter-) Verzeichnisse

Hallo miteinander

Seit mehreren Wochen nutze ich administrator.de nun passiv. Es wird Zeit auch aktiver Nutzer zu werden face-smile
Für die Musik-Jukebox einer Bar habe ich eine Batch-Datei geschrieben, welche neu hinzugefügte Dateien mit höherer Priorität spielt. Vieles davon mit Hilfe von Eueren Beiträgen...

Meine Batch Datei sortiert unter anderem den Inhalt eines Verzeichnisses inkl. Unterverzeichnissen nach Erstellungsdatum:
dir "%audiodir%*.mp3" /T:C/A:-D/O:-D/S/B>>%audiodata%  

Die Anzahl der neusten Dateien lässt sich per Variable setzen. Um das Problem zu verdeutlichen, definiere ich die Anzahl für dieses Beispiel mit 5. Gehen wir davon aus, dass die Nummerierung der Files der Erstellung entspricht (eine Nummerierung ist in der echten Umgebung nicht vorhanden). Hauptverzeichnis ist "D:\audio\rotation\" mit zwei Unterverzeichnissen. Die Ausgabe in der entsprechenden Datei sieht dann so aus:

D:\audio\rotation\day\test7.mp3
D:\audio\rotation\day\test5.mp3
D:\audio\rotation\day\test3.mp3
D:\audio\rotation\day\test1.mp3
D:\audio\rotation\night\test8.mp3

D:\audio\rotation\night\test6.mp3
D:\audio\rotation\night\test4.mp3
D:\audio\rotation\night\test2.mp3

Um nun aber wirklich alle neusten MP3 Dateien der beiden Verzeichnissen zu erwischen müsste die Ausgabe folgendermassen aussehen:

D:\audio\rotation\night\test8.mp3
D:\audio\rotation\day\test7.mp3
D:\audio\rotation\night\test6.mp3
D:\audio\rotation\day\test5.mp3
D:\audio\rotation\night\test4.mp3

D:\audio\rotation\day\test3.mp3
D:\audio\rotation\night\test2.mp3
D:\audio\rotation\day\test1.mp3

Trotz durchsuchen des (gefühlten) ganzen Webs, konnte ich hierfür keinen Lösungsansatz finden. Weiss jemand von Euch wie dieses Problem zu lösen ist? Das komplette Batch-Script gibt es hier.

Gruss und besten Dank schon im Voraus.

Reto

Content-Key: 115379

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

Printed on: April 18, 2024 at 14:04 o'clock

Member: Biber
Biber May 06, 2009 at 07:38:31 (UTC)
Goto Top
Moin buffalos-bar,

willkommen auf der aktiven Seite des Forums.

Auch wenn ich mir Dein komplettes Batchskript angeschaut habe werde ich dennoch hier nur eine mögliche Lösungsskizze bezogen auf das oben geschilderte Kernproblem posten.

ich denke, die konkrete Umsetzung in Deinem Schnipsel bkommst Du problemlos hin.

Ich schlage als Strategie vor, einen Zwischenschritt einzuschieben, der eine Sortierung nach Datum ermöglicht.
Dazu die DIR-Ausgabe (bisher bestehend aus den vollständigen Pfad/Dateinamen) erweitern um eine Anfangsspalte mit einem nachempfundenen ANSI-Datumsstring yymmtthhmm.

Beispiel/Demo zum Nachturnen am CMD-Prompt:

>(for /f "delims=" %i in ('dir "D:\temp\*.bat" /T:C/A:-D/O:-D/S/B') do @for /f "tokens=1-5 delims=.: " %a in ("%~ti") do @echo [%c%b%a%d%e] "%i")|sort /revers  
[0904061612] "D:\temp\test.bat"  
[0901261722] "D:\temp\trimIt.bat"  
[0812051804] "D:\temp\erstf.bat"  
[0811171948] "D:\temp\testFromWhere.bat"  
[0811131926] "D:\temp\echotest.bat"  
[0810132147] "D:\temp\Remap.bat"  
...
[0710302312] "D:\temp\backup3\Test.bat"  
[0710081924] "D:\temp\dit & dat\battest.bat"  
.....
[0506081541] "D:\temp\findpath200.bat"  
[0506061256] "D:\temp\templogs\last4.bat"  

Ich denke, das Prinzip sollte deutlich geworden sein.

Wenn nicht.... nachfragen.

Grüße
Biber
Member: buffalos-bar
buffalos-bar May 06, 2009 at 08:05:23 (UTC)
Goto Top
Hi Biber

Danke für die schnelle Antwort.

Über einen Lösungsansatz in diese Richtung habe ich mir auch schon Gedanken gemacht. Diesen musste ich allerdings verwerfen, da SORT offenbar nur bei Dateien bis 64KB funktioniert. Meine Textdatei beinhaltet jedoch alle MP3 Dateien im Verzeichnis (was durchaus mehrere tausend werden können). Da wird die 64KB Marke sehr bald mal geknackt face-sad
Member: buffalos-bar
buffalos-bar May 06, 2009 at 08:50:14 (UTC)
Goto Top
Habe dein Beispiel ausprobiert. Im CMD funktioniert dies einwandfrei, als Batch bricht die Verarbeitung jedoch ab. Mir ist nicht klar warum...

Was die 64KB angehen, weisst du da mehr?
Member: Biber
Biber May 06, 2009 at 08:59:46 (UTC)
Goto Top
Moin buffalos-bar,

mag sein, dass "Sort" nur bsi 64 KB funktioniert... habe ich noch nie ausprobiert.

Aber egal... selbst wenn es so wäre....
---> dann sorgen wir eben dafür, dass weniger als 64KB Daten zu SORTieren sind.

Wir können doch, wenn wir ohnehin das Datei-Datum in die hand nehmen z B.
- (mit reinem Batch Text-Vergleich) nur die Daten des aktuellen Jahres "2009" und/oder des aktuellen Monats "durchlassen"
- oder aber mit irgendetwas, das datumsbezogen rechnen kann (WasFile.exe, XCopy.exe, Vbscript..) nur alle Dateien zusammenschaufeln die jünger sind als 15 Tage oder whatever.
- oder, ganz andere Strategie, wir setzen eine "FOR /D"-Anweisung vor Deine ursprüngliche DIR-Mimik und holen aus jedem Unterverzeichnis die jüngsten 10 Dateien und prüfen nur dann nur diese x * 10 Dateien

Welche zusätzliche Restriktion ("nicht älter als...") wäre denn bei Dir sinnvoll?

Grüße
Biber
Member: buffalos-bar
buffalos-bar May 06, 2009 at 09:09:21 (UTC)
Goto Top
Perfekt wäre natürlich die Dateien abhängig vom Alter auswählen zu können. Also alle Dateien die jünger als (z..Bsp.) 2 Monate sind in eine Datei zu schreiben. Dann wäre auch die Reihenfolge der Ausgabe egal.
Würde dies funktionieren, wäre die ganze "play count" routine überflüssig, da zu alte Dateien einfach nicht mehr in der Ausgabedatei erscheinen.

Bisher scheiterte eine solche Lösung jedoch an meinen Basic Kenntnissen, bzw. daran, dass Basic nicht datumsbezogen rechnen kann.
Member: Biber
Biber May 06, 2009 at 09:20:43 (UTC)
Goto Top
Moin buffalos-bar,

wenn denn eine "nicht-älter-als"-Einschränkung sinnvoll ist, dann solltest Du hier in "Batch & Shell" mehrere Beispiele finden können. [Such-]Stichworte/Utilities s.o.

Meine Empfehlung wäre wahrscheinlich das WasFile-Tool von Horst Schaeffer.
[siehe in den Links in "Batches 4 Hell" hier im Forum.]

Appetitmacher:
>wasfile
WasFile, ver. 2.2 (c) 2006-2007, Horst Schaeffer
compares ..
    the time&date of two files (or directories),
    the date only, time ignored
    the date of a file with TODAY-n (days)
    the time&date of a file with NOW-n (minutes)
Examples:
    WasFile this.zip created before that.zip
    WasFile this.zip modified after today-8
Syntax:
    WasFile File1 [Stamp] [not] before|after|sametime File2 [Stamp] [Option]
    WasFile File1 [Stamp] [not] before|after|sametime today-n [Option]
    WasFile File1 [Stamp] [not] before|after|sametime now-n
Stamp is either:
    created, modified (default) or accessed
    (by default second stamp = first stamp)
Options to compare date only, ignore time:
    /DateLocal or /DateUTC
    (if TODAY is used, default is /DateLocal)
Result by errorlevel:
    0: true, 1: false, 255: error (message to STDERR)

--> dat heisst, mit diesem Tool kannst Du in stilisierten Denglisch mit now-n festlegen, wie oll oder frisch die Kamellen in Deiner Musikbox denn sein dürfen.

Grüße
Biber
Member: buffalos-bar
buffalos-bar May 06, 2009 at 09:24:33 (UTC)
Goto Top
Sehr sexy face-smile
Ich arbeite da mal was aus und melde mich nochmals hier was dabei rauskam.

Thanks a lot!

Grüsse
Reto
Member: buffalos-bar
buffalos-bar May 06, 2009 at 09:56:55 (UTC)
Goto Top
Sieht sehr gut aus!
Ich werde folgenden Ansatz weiterverfolgen:

echo test.log>test.log
for /f "delims=" %%i in ('dir "D:\temp\" /A:-D/S/B') do (  
  WasFile "%%i" created before today-5  
  if errorlevel == 1 (
    echo %%i>>test.log
  )
)
pause
if exist test.log del test.log
exit

Besten Dank nochmals für die ultraschnelle Hilfe. Top!

Grüsse
Reto
Member: buffalos-bar
buffalos-bar May 06, 2009 at 11:05:05 (UTC)
Goto Top
Habe meinen Ansatz nun getestet mit ca. 3000 Dateien die durchgeackert werden müssen. Leider ist das Script nun saulangsam face-sad Du hast noch eine Schleife erwähnt, mit welcher man die neusten x Dateien aus jedem Unterverzeichnis ausgeben kann. Ist dies dynamisch unabghängig von den Verzeichnisnamen zu realisieren? Dann würde ich jedes verzeichnis auf 50 Ausgaben begrenzen, was die Performance wieder deutlich erhöhen sollte.
Member: Biber
Biber May 06, 2009 at 11:47:35 (UTC)
Goto Top
Hmmja, Reto,

3000x eine whatever.exe aufrufen, dat dauert...

Okay, dann folgender Ansatz

[zum Testen am CMD-Prompt am Besten vorher das Fenster ein bisschen größer machen:
mode con cols=166 lines=55
]
>for /d %v in (d:\temp\*) do  @for /f "tokens=1* delims=:" %i in ('dir "%v\*.txt " /T:C/A:-D/O:-D/S/B ^2^>nul^|findstr /n $') do @if %i leq 3 @echo [%i] %j %~tj  
[1] d:\temp\Aqt822\install_instructions.txt 28.09.07 14:21
[1] d:\temp\Backup1\netuse.txt 23.11.04 09:51
[2] d:\temp\Backup1\netuseDez08.txt 08.12.04 14:17
[3] d:\temp\Backup1\Admincopy\Anwendungsdaten\Microsoft\Internet Explorer\brndlog.txt 21.04.05 12:27
[1] d:\temp\backup2\netuse.txt 23.11.04 09:51
[2] d:\temp\backup2\vwtnetuseDez08.txt 08.12.04 14:17
[3] d:\temp\backup2\test.txt 21.06.06 16:21
[1] d:\temp\eins\Beispiel.txt 15.11.06 15:49
[2] d:\temp\eins\benutzer1.txt 20.09.06 09:29
[3] d:\temp\eins\binfile.txt 23.11.06 21:02
[1] d:\temp\FVA\uncpath.vbs.txt 18.01.07 20:15
[2] d:\temp\FVA\SendToOL.reg.txt 14.03.07 16:38
[1] d:\temp\head\doc\head.txt 27.05.02 20:43
[1] d:\temp\Herber\vbePLUSde\Liesmich.txt 17.03.01 10:34
[1] d:\temp\HH\DjbrandtExcel.txt 20.03.06 16:37
[1] d:\temp\input\extract2bat.txt 29.09.05 10:46
[2] d:\temp\input\jetzte001auszug.txt 28.09.05 14:17
[3] d:\temp\input\setipconfig2IP.txt 07.06.05 14:19

in dieser Beispielzeile ist alles drin, was ich demonstrieren wollte:
  • Vorn ist die FOR/D-Anweisung, mit der ich alle Unterverzeichnisse %v unterhalb von D:\temp\ durchwackele
  • in diesen Unterverzeichnissen %v suche ich nach *.txt
  • der DIR-Befehl ist ein bisschen angepasst - jetzt ABsteigend nach Datum/neueste zuerst und "Datei nicht gefunden"-Fehlermeldungen werden nach NUL entsorgt
 'dir "%v\*.txt " /T:C/A:-D/O:-D/S/B ^2^>nul^ ....  
  • und das verbleibende Ergebnis wid an FindStr.exe zur Durchnummerierung übergeben. Dabeio käme raus.
.....
1:d:\temp\WRK_ad.de\accounts.txt
2:d:\temp\WRK_ad.de\FORSchleife.txt
1:d:\temp\xxx\Beispiel.txt
2:d:\temp\xxx\DeCryptErgebnis.txt
3:d:\temp\xxx\Paul3.txt
4:d:\temp\xxx\Paul3end.txt
  • von diesen "Datensätzen" will ich aber nur die, die vorne eine 1,2 oder 3 stehen haben. Dazu diese geänderte Zerlegung der FOR/F-Anweisung mit %i und %j und "delims=:" und später LEQ 3

Grüße
Biber