Top-Themen

Aktuelle Themen (A bis Z)

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, 4383 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 ..
Ähnliche Inhalte
Batch & Shell
Dateien suchen, kopieren und sortieren
Frage von BAD1HORBatch & Shell6 Kommentare

Hallo, folgendes Problem: Dateien, die auf einem Laufwerk monatsweise in Ordnern abgelegt sind, sollen per Batch auf ein anderes ...

Batch & Shell
Dateien in alphabetische Ordner sortieren
gelöst Frage von symei3Batch & Shell10 Kommentare

Hallo Forumsgemeinde, leider habe ich sehr wenig Ahnung von Batchdateien etc. Deswegen wird meine Frage vermutlich nur ein leises ...

Suse
Mehrere Verzeichnisse bei Suche ausschliessen
gelöst Frage von JedujaSuse3 Kommentare

Ich möchte mit einer Suche alle Dateien (nicht Verzeichnisse) ab einer bestimmten Grösse nach Grösse sortiert ausgeben lassen und ...

Apache Server
Weiterleitung eines nicht mehr existierenden Verzeichnisses
Frage von TrubleApache Server1 Kommentar

Hallo, wir habe eine neue Webseite. Auf der alten Webseite lagen die Dokumente unter "www.domain.de/fileadmin/Redakteure/Downloads/" Auf der neuen Webseite ...

Neue Wissensbeiträge
Perl

Perl hat heute Geburtstag: 30 Jahre Perl: Lange Gesichter zum Geburtstag

Information von Penny.Cilin vor 5 StundenPerl2 Kommentare

Hallo, auch wenn es wenige wissen und noch weniger Leute es nutzen. Perl hat heute Geburtstag. 30 Jahre Perl ...

Sicherheit

Blackberry stirbt - Keine Updates für Priv mehr

Tipp von certifiedit.net vor 6 StundenSicherheit

Blackberry wird zu einer 08/15 Firma und geht wohl mehr und mehr den Weg, den HTC schon ging. Von ...

Windows 10

Autsch: Microsoft bündelt Windows 10 mit unsicherer Passwort-Manager-App

Tipp von kgborn vor 2 TagenWindows 1010 Kommentare

Unter Microsofts Windows 10 haben Endbenutzer keine Kontrolle mehr, was Microsoft an Apps auf dem Betriebssystem installiert (die Windows ...

Sicherheits-Tools

Achtung: Sicherheitslücke im FortiClient VPN-Client

Tipp von kgborn vor 2 TagenSicherheits-Tools

Ich weiß nicht, wie häufig die NextGeneration Endpoint Protection-Lösung von Fortinet in deutschen Unternehmen eingesetzt wird. An dieser Stelle ...

Heiß diskutierte Inhalte
Batch & Shell
Kann man mit einer .txt Datei eine .bat Datei öffnen?
gelöst Frage von HelloWorldBatch & Shell22 Kommentare

Wie schon im Titel beschrieben würde ich gerne durch einfaches klicken auf eine Text oder Word Datei eine Batch ...

Netzwerkgrundlagen
Belibiges Teilnetz einer Subnetzmaske rausfinden?
gelöst Frage von CenuzeNetzwerkgrundlagen17 Kommentare

Wundervollen Gutentag, mittlerweile kann ich Subnetting so einigermaßen, aber ein Problem habe ich noch. Netzwerkadresse und Boradcast errechnen ist ...

LAN, WAN, Wireless
WLAN Reichweite erhöhen mit neuer Antenne
gelöst Frage von gdconsultLAN, WAN, Wireless12 Kommentare

Hallo, ich besitze einen TL-WN722N USB-WLAN Dongle mit einer richtigen Antenne. Ich frage mich jetzt ob man die Reichweite ...

Windows Server
Logging von "gesendeten Nachrichten" auf Terminalservern
gelöst Frage von Z3R0C0MM4N0THiN6Windows Server10 Kommentare

Hallo zusammen, kann mir jemand auf kurzem Wege sagen ob 1) die per Task-Manager (oder damals tsadmin) an Benutzer ...