Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Sortieren von Dateien über mehrere (Unter-) Verzeichnisse

Frage Entwicklung Batch & Shell

Mitglied: buffalos-bar

buffalos-bar (Level 1) - Jetzt verbinden

06.05.2009, aktualisiert 08:47 Uhr, 4355 Aufrufe, 10 Kommentare

Hallo miteinander

Seit mehreren Wochen nutze ich administrator.de nun passiv. Es wird Zeit auch aktiver Nutzer zu werden
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:
01.
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
Mitglied: Biber
06.05.2009 um 09:38 Uhr
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:

01.
>(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 
02.
[0904061612] "D:\temp\test.bat" 
03.
[0901261722] "D:\temp\trimIt.bat" 
04.
[0812051804] "D:\temp\erstf.bat" 
05.
[0811171948] "D:\temp\testFromWhere.bat" 
06.
[0811131926] "D:\temp\echotest.bat" 
07.
[0810132147] "D:\temp\Remap.bat" 
08.
... 
09.
[0710302312] "D:\temp\backup3\Test.bat" 
10.
[0710081924] "D:\temp\dit & dat\battest.bat" 
11.
..... 
12.
[0506081541] "D:\temp\findpath200.bat" 
13.
[0506061256] "D:\temp\templogs\last4.bat"
Ich denke, das Prinzip sollte deutlich geworden sein.

Wenn nicht.... nachfragen.

Grüße
Biber
Bitte warten ..
Mitglied: buffalos-bar
06.05.2009 um 10:05 Uhr
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
Bitte warten ..
Mitglied: buffalos-bar
06.05.2009 um 10:50 Uhr
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?
Bitte warten ..
Mitglied: Biber
06.05.2009 um 10:59 Uhr
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
Bitte warten ..
Mitglied: buffalos-bar
06.05.2009 um 11:09 Uhr
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.
Bitte warten ..
Mitglied: Biber
06.05.2009 um 11:20 Uhr
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:
01.
>wasfile 
02.
WasFile, ver. 2.2 (c) 2006-2007, Horst Schaeffer 
03.
compares .. 
04.
    the time&date of two files (or directories), 
05.
    the date only, time ignored 
06.
    the date of a file with TODAY-n (days) 
07.
    the time&date of a file with NOW-n (minutes) 
08.
Examples: 
09.
    WasFile this.zip created before that.zip 
10.
    WasFile this.zip modified after today-8 
11.
Syntax: 
12.
    WasFile File1 [Stamp] [not] before|after|sametime File2 [Stamp] [Option] 
13.
    WasFile File1 [Stamp] [not] before|after|sametime today-n [Option] 
14.
    WasFile File1 [Stamp] [not] before|after|sametime now-n 
15.
Stamp is either: 
16.
    created, modified (default) or accessed 
17.
    (by default second stamp = first stamp) 
18.
Options to compare date only, ignore time: 
19.
    /DateLocal or /DateUTC 
20.
    (if TODAY is used, default is /DateLocal) 
21.
Result by errorlevel: 
22.
    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
Bitte warten ..
Mitglied: buffalos-bar
06.05.2009 um 11:24 Uhr
Sehr sexy
Ich arbeite da mal was aus und melde mich nochmals hier was dabei rauskam.

Thanks a lot!

Grüsse
Reto
Bitte warten ..
Mitglied: buffalos-bar
06.05.2009 um 11:56 Uhr
Sieht sehr gut aus!
Ich werde folgenden Ansatz weiterverfolgen:

01.
echo test.log>test.log 
02.
for /f "delims=" %%i in ('dir "D:\temp\" /A:-D/S/B') do ( 
03.
  WasFile "%%i" created before today-5 
04.
  if errorlevel == 1 ( 
05.
    echo %%i>>test.log 
06.
07.
08.
pause 
09.
if exist test.log del test.log 
10.
exit
Besten Dank nochmals für die ultraschnelle Hilfe. Top!

Grüsse
Reto
Bitte warten ..
Mitglied: buffalos-bar
06.05.2009 um 13:05 Uhr
Habe meinen Ansatz nun getestet mit ca. 3000 Dateien die durchgeackert werden müssen. Leider ist das Script nun saulangsam 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.
Bitte warten ..
Mitglied: Biber
06.05.2009 um 13:47 Uhr
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
]
01.
>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 
02.
[1] d:\temp\Aqt822\install_instructions.txt 28.09.07 14:21 
03.
[1] d:\temp\Backup1\netuse.txt 23.11.04 09:51 
04.
[2] d:\temp\Backup1\netuseDez08.txt 08.12.04 14:17 
05.
[3] d:\temp\Backup1\Admincopy\Anwendungsdaten\Microsoft\Internet Explorer\brndlog.txt 21.04.05 12:27 
06.
[1] d:\temp\backup2\netuse.txt 23.11.04 09:51 
07.
[2] d:\temp\backup2\vwtnetuseDez08.txt 08.12.04 14:17 
08.
[3] d:\temp\backup2\test.txt 21.06.06 16:21 
09.
[1] d:\temp\eins\Beispiel.txt 15.11.06 15:49 
10.
[2] d:\temp\eins\benutzer1.txt 20.09.06 09:29 
11.
[3] d:\temp\eins\binfile.txt 23.11.06 21:02 
12.
[1] d:\temp\FVA\uncpath.vbs.txt 18.01.07 20:15 
13.
[2] d:\temp\FVA\SendToOL.reg.txt 14.03.07 16:38 
14.
[1] d:\temp\head\doc\head.txt 27.05.02 20:43 
15.
[1] d:\temp\Herber\vbePLUSde\Liesmich.txt 17.03.01 10:34 
16.
[1] d:\temp\HH\DjbrandtExcel.txt 20.03.06 16:37 
17.
[1] d:\temp\input\extract2bat.txt 29.09.05 10:46 
18.
[2] d:\temp\input\jetzte001auszug.txt 28.09.05 14:17 
19.
[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
01.
 '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.
01.
..... 
02.
1:d:\temp\WRK_ad.de\accounts.txt 
03.
2:d:\temp\WRK_ad.de\FORSchleife.txt 
04.
1:d:\temp\xxx\Beispiel.txt 
05.
2:d:\temp\xxx\DeCryptErgebnis.txt 
06.
3:d:\temp\xxx\Paul3.txt 
07.
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
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Batch & Shell
Mehrere.csv Dateien zusammenfügen zu einer Datei mit bat (4)

Frage von Piotrney zum Thema Batch & Shell ...

Outlook & Mail
Outlook 2010 zeigt Übermittlungsfehler und erstellt mehrere PST-Dateien

Frage von thepatsch zum Thema Outlook & Mail ...

Batch & Shell
gelöst Mehrere PDF-Dateien per Batch zusammenfügen (1)

Frage von Grimmli zum Thema Batch & Shell ...

Linux Tools
CURL mehrere Dateien vom ftp-Server herunterladen (10)

Frage von highpriest zum Thema Linux Tools ...

Heiß diskutierte Inhalte
Router & Routing
gelöst Ipv4 mieten (22)

Frage von homermg zum Thema Router & Routing ...

Exchange Server
gelöst Exchange 2010 Berechtigungen wiederherstellen (20)

Frage von semperf1delis zum Thema Exchange Server ...

Windows Server
DHCP Server switchen (20)

Frage von M.Marz zum Thema Windows Server ...

Hardware
gelöst Negative Erfahrungen LAN-Karten (19)

Frage von MegaGiga zum Thema Hardware ...