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
GELÖST

Batch um Dateien nach Anzahl in Ordner abzulegen

Frage Entwicklung Batch & Shell

Mitglied: SebastianJu

SebastianJu (Level 1) - Jetzt verbinden

25.10.2008, aktualisiert 26.10.2008, 5822 Aufrufe, 9 Kommentare

Hallo,

ich suche eine Möglichkeit eine Batchdatei in einem Verzeichnis auszuführen in dem eine große Anzahl von kleinen Dateien liegt. Können ein paar Zehntausend sein. Diese Dateien sollen nun alphabetisch nach einer bestimmten Anzahl in Unterordner verpackt werden. Wenn die Anzahl zB 500 wäre dann sollen die ersten 500 Dateien in einen Unterordner der 00500 heißt. Die nachfolgenden in 01000 usw. Pro Datei könnte man das nötige Unterverzeichnis herausfinden indem man zB die Nummer der Datei nimmt die fraglich ist und durch 500 teilt. Davon die Ganzzahl und das wieder mal 500. Dann müsste bei Bedarf nur noch eine Anzahl Nullen davorgesetzt werden damit die Unterordner sortiert sind.

Kann man das mit einer Batch lösen? Ich kenne mich ein wenig damit aus aber nicht so gut um das sagen zu können...

Grüße!
Sebastian
Mitglied: bastla
25.10.2008 um 08:19 Uhr
Hallo SebastianJu und willkommen im Forum!

Diese Dateien sollen nun alphabetisch ...
... die Nummer der Datei ...
Wenn die Dateien bereits Nummern haben, wozu dann eine alphabetische Ordnung?

Sollte der Dateiname tatsächlich bereits eine laufende Nummer enthalten, wäre es sinnvoll, den Aufbau des Namens darzustellen.

Grüße
bastla
Bitte warten ..
Mitglied: bastla
25.10.2008 um 09:31 Uhr
... unabhängig davon, ob die Nummer erst erzeugt werden muss (davon geht der folgende Ansatz aus) oder bereits vorhanden ist, könnte der Ablauf etwa so aussehen:
01.
@echo off & setlocal 
02.
set "Ordner=D:\Ordner mit vielen Dateien" 
03.
set /a Einh=500 
04.
set /a Start=1000000000 
05.
 
06.
pushd "%Ordner%" 
07.
set /a ONr=%Start% 
08.
set /a Nr=0 
09.
 
10.
for /f "delims=" %%i in ('dir /b /a-d /on') do call :ProcessFile "%%i" 
11.
popd 
12.
goto :eof 
13.
 
14.
:ProcessFile 
15.
set /a Chk=%Nr%%%%Einh% 
16.
if %Chk% neq 0 goto :MoveFile 
17.
 
18.
set /a ONr+=%Einh% 
19.
set Akt=%ONr:~-5% 
20.
md %Akt% 
21.
 
22.
:MoveFile 
23.
move %1 %Akt% 
24.
set /a Nr+=1 
25.
goto :eof
Die Stellenanzahl (Stichwort: "führende Nullen") für die Ordnernamen ist derzeit auf 5 gesetzt (siehe Zeile 19), kann aber bei Bedarf auf bis zu 9 erhöht werden.

Grüße
bastla

[Edit] Alphabetische Sortierung ergänzt [/Edit]
[Edit2] Fehlendes "%"-Zeichen in Zeile 15 nachgetragen {/Edit2]
Bitte warten ..
Mitglied: Biber
25.10.2008 um 13:22 Uhr
Moin SebastianJu,

willkommen im Forum.
noch eine kleine Fussnote zu bastlas Lösung.

Wenn Du wirklich ein paar 10000 Dateien bearbeiten willst, dann wäre unter Umständen als Zwischenschritt das Schreiben des DIR-Outputs in eine temporäre Datei performanter.

Also statt
.. 
for /f "delims=" %%i in ('dir /b /a-d /on') do ( 
...
..lieber der Umweg..
01.
.. 
02.
dir /b /a-d /on>%temp%\dirlist.txt 
03.
for /f "delims=" %%i in (%temp%\dirlist.txt) do ( 
04.
.. 
05.
06.
del %temp%\dirlist.txt 
07.
...
Okay, wenn der Batch natürlich die einzige gestartete Anwendung ist und sich die Arbeitsspeicher-Ressourcen mit keinen anderen Prozessen teilen muss, dann ist es egal.
Aber im Normalfall soll dieser Batch ja irgendwo im Hintergrund vor sich hin drömeln, während Du im Vordergrund weiterhin ruckelfrei Videoclips geniesst....

Grüße
Biber
Bitte warten ..
Mitglied: SebastianJu
26.10.2008 um 00:36 Uhr
Hallo,

ich habe das erste Skript probiert. Beim zweiten wußte ich nicht wo ich den zweiten Teil reinsetzen soll.

Das Skript arbeitet durch. Erzeugt auch korrekt die Verzeichnisse (Anzahl und Name passt) aber die Dateien werden noch nicht kopiert. Im Zielverzeichnis sind dann halt die Verzeichnisse und die Dateien aber nicht auf die Verzeichnisse verteilt.

Den Code durchschaue ich im Moment noch nicht. Ich werde mir aber mal die Befehle ansehen. Solche Bat-Dateien sind ja immerhin ziemlich nützlich...

Danke für den Code...

Grüße!
Sebastian
Bitte warten ..
Mitglied: Biber
26.10.2008 um 02:36 Uhr
Moin SebastianJu,

bastla ist anscheinend noch inner Disse - deshalb versuche ich mal seine Variante zu kommentieren und auch meine Winz-Änderung einzubauen.
01.
@echo off & setlocal 
02.
:: Echo der Befehle auf dem Bildscirm AUS 
03.
:: setlocal: alle mit SET gesetzten Variablen gelten nur in diesem Batch 
04.
 
05.
set "Ordner=D:\Ein Ordner mit den vielen Dateien" 
06.
::Hier anpassen: Dein Ordnername 
07.
 
08.
set /a Einh=500 
09.
:: Paketgröße...numerische Variable; 500 Dateien je Ordner 
10.
 
11.
set /a Start=1000000000 
12.
:: Hilfvariable, die letzten x Zeichen davon bilden den Verzeichnisnamen 
13.
 
14.
pushd "%Ordner%" 
15.
:: Wechseln in das Verzeichnis, in dem die vielen Dateien liegen 
16.
:: Und das Verzeichnis merken, von dem Du gestartet bist 
17.
 
18.
set /a ONr=%Start% 
19.
set /a Nr=0 
20.
:: Zwei weitere numerische Variablen. 
21.
:: Was eine 0Nr ist, bekommst Du im Lauf des Lebens alleine raus...*g 
22.
 
23.
dir /b /a-d /on>%temp%\dirlist.txt 
24.
:: Komplettinhalt des Verszeichnisses in eine Temp-Datei schreiben 
25.
 
26.
for /f "delims=" %%i in (%temp%\dirlist.txt) do call :ProcessFile "%%i" 
27.
:: Für alle Zeilen in der Temp-Datei jeweils die ganze Zeile  
28.
:: als Parameter %%i für einen Sub-Block :ProcessFile weiterreichen 
29.
 
30.
:: Wenn Du hier ankommst, sind ALLE Zeilen/ALLE Dateien verarbeitet 
31.
 
32.
del  %temp%\dirlist.txt>nul 
33.
popd 
34.
:: Aufräumarbeiten 
35.
 
36.
goto :eof 
37.
:: ~~~Hier ist der Batch zu Ende~~ Unterhalb nur Sub-Routinen 
38.
 
39.
:ProcessFile 
40.
set /a Chk=Nr %% Einh 
41.
:: Errechne Variable Chk als [Nr modulo Einh];  
42.
:: Bsp: 777 mod 500=277 
43.
 
44.
if %Chk% neq 0 goto :MoveFile 
45.
:: wenn Chk NICHT 0 ist, weiter zu :MoveFile.  
46.
 
47.
:: Andernfalls sind 500 Dateien im Ordner.  
48.
:: Dann hier weiter. 
49.
set /a ONr+=%Einh% 
50.
:: die Basis für den nächsten Ordnernamen hochzählen 
51.
 
52.
set Akt=%ONr:~-5% 
53.
ECHO md %Akt% 
54.
:: Von numerischen Wert die letzten 5 Stellen nehmen und Verzeichnis anlegen. 
55.
 
56.
:MoveFile 
57.
ECHO move %1 %Akt% 
58.
:: nächste Datei verschieben 
59.
set /a Nr+=1 
60.
:: ...und den Zähler für die max.500 bzw. max %Einh% um 1 erhöhen. 
61.
goto :eof 
62.
:: hier bedeutet "goto :eof"-->Ende von :Processfile
Zusätzlich habe ich vor den beiden eigentlich arbeitenden Befehlen MD und MOVE ein GROSS geschriebenes ECHO gesetzt - so kannst Du den Batch als Simulation durchlaufen lassen und siehst, was passieren würde.

Das müssen wir jetzt einmal tun, um den Fehler bei Dir zu finden.
Poste bitte den Output (bzw. ein paar Zeilen davon).

Grüße
Biber
Bitte warten ..
Mitglied: bastla
26.10.2008 um 09:09 Uhr
@Biber
Danke für die Nachtschicht ...

... und ja, ich kenne die Passage
Somit können Sie mit Umgebungsvariablen Berechnungen vornehmen, ohne %-Zeichen einzugeben ...
aus der Hilfe zu "set" und hatte auch daran gedacht, diese Kurzform zu verwenden, es aber dann "gut gemeint" (was ja nicht ohne Grund als Gegenteil von "gut gemacht" gilt) und trotzdem die Variablenschreibweise wie gewohnt mit %Variable% vorgenommen.

Dass übrigens %%% anstelle von %% im Batch auch funktionieren kann, ist mir neu - sogar ein
for %%i in (*.txt) do echo %%%i
läuft anstandslos durch ...


@SebastianJu
Jetzt habe ich da oben in Zeile 15 schon so viele "%"-Zeichen verwendet, und dann war's immer noch um eines zu wenig (oder um 3 zuviel ) - ist korrigiert, kann aber nicht der Grund für das "Nicht-Verschieben" gewesen sein, da es sich (weshalb mir beim Testen auch nichts aufgefallen war) nicht weiter ausgewirkt hat (die Verzeichnisse wurden ja auch erstellt).

Mit Bibers Version müsste es aber auf jeden Fall klappen (und wenn Du nach dem erfolgreichen Testen die beiden angesprochenen ECHO entfernst, werden auch tatsächlich Verzeichnisse erstellt und Dateien verschoben).

Grüße
bastla
Bitte warten ..
Mitglied: SebastianJu
26.10.2008 um 15:28 Uhr
Hallo,

danke für die Mühe. Ist schon verständlicher geworden der Code.

Ich habe es jetzt mal durchlaufen lassen. Zur Anzeige habe ich ein "ping -n 300 127.0.0.1 > NUL"
vor dem ersten "goto :eof" eingebaut. Als Ergebnis kommt so etwas heraus:

Für Verzeichniserstellung, die ja klappt:

md 00827 (Bei Zusammenfassung pro 827 Dateien)

Die Aufrufe für das Verschieben sehen dann so aus:

move "Zybex - Cheatcodes - Computer Cheat - Cheat Code - Internet Game Cheats -
PC Cheat - PC Codes - PC Game Codes - PC Games Cheat.url" 16540
move "Zyconix - Cheatcodes - Computer Cheat - Cheat Code - Internet Game Cheats
- PC Cheat - PC Codes - PC Game Codes - PC Games Cheat.url" 16540
move "Zylogon - Cheatcodes - Computer Cheat - Cheat Code - Internet Game Cheats
- PC Cheat - PC Codes - PC Game Codes - PC Games Cheat.url" 16540
move "Zynaps - Cheatcodes - Computer Cheat - Cheat Code - Internet Game Cheats -
PC Cheat - PC Codes - PC Game Codes - PC Games Cheat.url" 16540
move "Zynon - Cheatcodes - Computer Cheat - Cheat Code - Internet Game Cheats -
PC Cheat - PC Codes - PC Game Codes - PC Games Cheat.url" 16540
move "Zyron - Cheatcodes - Computer Cheat - Cheat Code - Internet Game Cheats -
PC Cheat - PC Codes - PC Game Codes - PC Games Cheat.url" 16540
move "Zyrons Escape - Cheatcodes - Computer Cheat - Cheat Code - Internet Game C
heats - PC Cheat - PC Codes - PC Game Codes - PC Games Cheat.url" 16540
move "Zyto - Cheatcodes - Computer Cheat - Cheat Code - Internet Game Cheats - P
C Cheat - PC Codes - PC Game Codes - PC Games Cheat.url" 16540
move "Zytron Mega Blast - Cheatcodes - Computer Cheat - Cheat Code - Internet Ga
me Cheats - PC Cheat - PC Codes - PC Game Codes - PC Games Cheat.url" 16540
move "Zzzzz - Cheatcodes - Computer Cheat - Cheat Code - Internet Game Cheats -
PC Cheat - PC Codes - PC Game Codes - PC Games Cheat.url" 16540

Aber keine Fehlermeldungen. Dann habe ich die Echos entfernt. Im neuen Skript gibt es keine Ausgaben bis auf eine Fehlermeldung die ständig aufkommt(Vorher war viel auf dem Schirm ohne dass man etwas lesen konnte. Trotz Echo off):
"Der Dateiname oder die Erweiterung ist zu lang."

An diese Möglichkeit hatte ich am Anfang ja auch gedacht. Der Pfad in dem die Dateien liegen hat 48 Zeichen und die Dateien nicht mehr als 154 Zeichen. Außerdem werden die Verzeichnisse korrekt erstellt und wenn ich die Dateien von Hand reinkopiere gibt es auch keine Probleme. (Ich kenne die Probleme die auftauchen wenn ein Pfad inklusive Dateiname zu lang ist.)

Könnte das an einer Variablen liegen? Oder kann move keine so langen Pfade bearbeiten?
Die Batch kann ich doch auch ausführen wo ich will da der Pfad ja angegeben wird. Ich führe sie ein Verzeichnis über dem Verzeichnis aus in dem die Dateien liegen. Als Pfad gebe ich einfach nur den Namen des Verzeichnisses an in dem die Dateien liegen...

Grüße!
Sebastian
Bitte warten ..
Mitglied: Biber
26.10.2008 um 19:32 Uhr
Tja SebastianJu,

sieht in der Tat so aus, als hättest Du den bislang undokumentierten M$-Bug No. #138654 gefunden. Eventuell wird der mal nach Dir benannt.

Also, der MOVE-Befehl scheint offensichtliche Probleme mit diesen langen Dateinamen (oder den vielen Leerzeichen im Namen?)" zu haben.

Einfache Verifizierung dieser rufschädigenden Behauptung am CMD-Prompt:
[einzugebende Zeilen beginnen mit ">"]
>set "var=Zybex - Cheatcodes - Computer Cheat - Cheat Code - Internet Game Cheats - PC Cheat - PC Codes - PC Game Codes -PC Games Cheat.txt" 
>echo x>"%var%" 
>move "%var%" 00500 
Der Dateiname oder die Erweiterung ist zu lang.
Anmerkung: der Name der Datei "Zybex -...bla.txt" ist 133 Byte lang und das Verschieben sollte von "D:\temp" nach D:\temp\00500" erfolgen -- also kein erkennbares Limit in der Nähe.

Workaround.
Mach den MOVE-Befehl in zwei Schritten,
Zuerst COPY von A nach B, dann Löschen in A.

Konkret:
STREICHE:
MOVE %1 %Akt%

SETZE:
COPY %1 %Akt%
DEL %1
[Edit] Oder aber (Alternative II):
Oder Du benennst diese etwas sperrigen Dateinamen um
-> von: "Zybex - {endloses sinnfreies Reklamegelumpe}.url
--> in "Zybex.url"
und machst danacht den Schritt MOVE (auch wieder mit dem MOVE-Befehl).
Das ginge durch eine vorgeschaltete REN-Zeile vor der Zeile mit MOVE:
... 
FOR %%i in (%1) do FOR /F %%j in ("%%i") do ( 
         REN %1 %%j%%~xi 
         MOVE %%j%%~xi %Akt% 
REM Dieses FOR-Konstrukt STATT der Zeile "MOVE %1 %Akt%" 
...
[/Edit]

Grüße
Biber

Wie teuer is' nochmal dieses Redmonder Standard-Betriebssystem?
Bitte warten ..
Mitglied: SebastianJu
26.10.2008 um 19:51 Uhr
Super. Nach Ersetzen von Move klappt es wunderbar... Dein Beispiel darüber habe ich auch mal nachvollzogen. Der Inhalt der Datei wurde mit einem x ersetzt und auch dann wollte er die Datei nicht verschieben...

Aber so klappt es auch. Ich werde mir vielleicht noch eine Prozentanzeige dazubasteln und die Meldungen über kopierte Dateien ausblenden damit ich noch sehe wie weit es ist...

Vielen Dank!
Sebastian
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
gelöst Per Batch Dateien in einen Ordner - ext. Festplatte übertragen (2)

Frage von tocksick zum Thema Batch & Shell ...

C und C++
Dateien in Ordner kopieren anhand vom Teil eines Dateinamen (22)

Frage von onlyforu8373 zum Thema C und C ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (20)

Frage von Xaero1982 zum Thema Microsoft ...

Outlook & Mail
gelöst Outlook 2010 findet ost datei nicht (19)

Frage von Floh21 zum Thema Outlook & Mail ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Festplatten, SSD, Raid
M.2 SSD wird nicht erkannt (14)

Frage von uridium69 zum Thema Festplatten, SSD, Raid ...