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 zum Verschieben numerisch benannter Dateien möglich?

Frage Entwicklung Batch & Shell

Mitglied: computerwuffi

computerwuffi (Level 1) - Jetzt verbinden

24.04.2013 um 20:14 Uhr, 2501 Aufrufe, 17 Kommentare, 1 Danke

Geht das?

Hallo,

ich habe auf einem W2K Server tausende Dateien im gleich aufgebauten numerischen Format liegen, Beispiele:

100_1.txt
100_2.jpg
300_4.jpg
1000_1.jpg
140357_1.txt

Da es nun lange Zeit dauert, das Verzeichnis aufzulisten, möchte ich diese Dateien in Order mit 5000er -abstand einsortieren, also:

einen Ordner für alle Dateien 1_* bis 4999_*
einen Ornder für alle dateien 5000_* bis 9999_*
einen Ordner für alle Dateien 10000_* bis 14999_* usw ...

geht das mit einer Batch-Datei? Dabei ist leider nur ein Verschieben der Dateien möglich, weil sonst der Speicherplatz nicht reicht.

ich bin für jede Hilfe dankbar!
Mitglied: Pjordorf
24.04.2013 um 20:33 Uhr
Hallo,

Zitat von computerwuffi:
W2K Server tausende Dateien im gleich aufgebauten numerischen Format
Nein, laut deinem beispiel eben nicht im gleichen Aufbau.

100_1.txt
100_2.jpg
300_4.jpg

Und diese sind eben anders aufgebaut
1000_1.jpg

Und diese wiederum anders aufgebaut
140357_1.txt



geht das mit einer Batch-Datei?
Ja das geht.

Gruß,
Peter
Bitte warten ..
Mitglied: bastla
24.04.2013, aktualisiert um 20:44 Uhr
@ Pjordorf
Die Beispiele weisen mE durchaus auf eine Gemeinsamkeit hin, daher könnte ein Batch schematisch etwa so aussehen:
01.
@echo off & setlocal 
02.
for %%i in ("D:\Ordner mit vielen Dateien\*_*.*") do ( 
03.
    for /f "delims=_" %%z in ("%%~ni") do ( 
04.
        set /a Ordner=%%z / 5000 * 5000 
05.
        setlocal enabledelayedexpansion 
06.
        echo md "D:\Ordner mit vielen Dateien\!Ordner!" 2>nul 
07.
        echo move "%%i" "D:\Ordner mit vielen Dateien\!Ordner!" 
08.
        endlocal 
09.
10.
11.
pause
Solange die beiden "echo" in den Zeilen 6 und 7 stehen, werden beim Testen (eines Ordners mit vielleicht nur mal 50 entsprechenden Dateien ) jeweils die Befehle zum Erstellen der Unterordners und zum Verschieben nur angezeigt ...

Grüße
bastla
Bitte warten ..
Mitglied: computerwuffi
24.04.2013 um 21:08 Uhr
Hallo Peter,

vielen Dank für deine Antwort. Entschuldige, wenn ich mich etwas unklar ausgedrückt habe. Mit gleich aufgebaut meinte ich im vorderen Teil (vor dem "_" eine Zahl von 1 bis derzeit ca 147000, dann der "_" mit nachfolgender Zahl zwischen 1 und 12, anschliessend eine beliebige Dateiendung.
Meine Denkblockade dabei liegt auch genau bei deinem Aufbauargument, ich weiss nicht, wie ich die einer, zehner, hunderter, tausender, Zehntausender in dem Batch filtern kann.
Wenn ich ein Programm schreiben müsste, würde ich in string umwandeln und dann mit length die Gruppen raussuchen, ab den Aufwand will ich mir möglichst ersparen wenn es anders geht. Da ich nicht viel Erfahrung mit Batch-Dateien habe, habe ich die Anfrage an die Spezialisten gestellt. Ich versuche jetzt mal, das Beispiel von bastla zu testen, auch wenn ich zunächst keine Ahnung habe, was da gemacht wird.

Gruß
Wolfgang
Bitte warten ..
Mitglied: bastla
24.04.2013, aktualisiert um 21:25 Uhr
Hallo computerwuffi und willkommen im Forum!
... auch wenn ich zunächst keine Ahnung habe, was da gemacht wird.
In der Kurzfassung:
  • Entnehme für jede Datei dem Dateinamen den Teil vor dem ersten "_",
  • dividiere diesen Teil ganzzahlig durch 5000 und multipliziere das Ergebnis mit 5000 (das ergibt für 100 den Ordnernamen 0 und für 140357 den Ordnernamen 140000),
  • erstelle den entsprechenden Ordner (und unterdrücke die Fehlermeldung, wenn es den Ordner bereits gibt) und
  • verschiebe die Datei in den errechneten Ordner.

Grüße
bastla
Bitte warten ..
Mitglied: computerwuffi
24.04.2013 um 21:36 Uhr
Hallo bastla,

ganz vielen herzlichen Dank für deine ausführliche Erklärung für einen Newbie, das bringt mich ein riesiges Stück weiter. Morgen werde ich das ganze mal testen.
Das Forum habe ich schon zu meiner Favoriten-Liste hinzugefügt, es ist echt interessant und sehr gut moderiert.

Viele Grüße
computerwuffi
Bitte warten ..
Mitglied: Pjordorf
24.04.2013 um 22:02 Uhr
Hi bastler,

Zitat von bastla:
Die Beispiele weisen mE durchaus auf eine Gemeinsamkeit hin,
Klar tun sie das. Die haben schon gweisse Gemeinsamkeiten. Wenn er jetzt aber nicht Numerisch sondern textmäßig sortiert uns die Liste präsentiert hätte sähe die schon anders aus. Und manchmal ist es gut einen newbie daran zu errinern das ein Computel eben ganz genau unterscheidet. Und da ein "_" eben keine gültige Zahl darstellt kann ein Computerl eben nur das ganze als text interpretieren udn dann ist eine Sorrtierung eben anders. Hier hat ein mensch die Texte als Nummer interpretiert und diese dann Numerisch aufsteigend sortiert. (Ich weiß, Erbsenzählerei )

Gruß,
Peter

PS. Wollte nur nicht als Antwort zu seiner Frage eben nur ein "Ja" dort reinschreiben
Bitte warten ..
Mitglied: Biber
25.04.2013 um 00:02 Uhr
[OT]
Zitat von computerwuffi:
Das Forum habe ich schon zu meiner Favoriten-Liste hinzugefügt, es ist echt interessant und sehr gut moderiert.
...dabei ist die Moderation in diesem Forum und speziell in diesem Bereich sehr dezent.

Willkommen im Forum.

Biber
[/OT]
Bitte warten ..
Mitglied: joemouth
25.04.2013 um 07:09 Uhr
Ich würde es mit zwei FOR /L Schleifen sowie SET /A machen:

FOR /L %Variable IN (Start,Schritt,Ende) DO Befehl [Parameter]

Der Satz ist eine Folge von Zahlen von Start bis Ende und der
angegebenen Schrittweite. So erstellt (1,1,5) die Folge 1 2 3 4 5 und
(5,-1,1) erstellt die Folge (5 4 3 2 1).

Die erste arbeitet in 5000er Schritten, die zweite innere FOR-Schleife in 1er Schritten von 1....4999.

Mit set /A .... kannst Du dann aus den beiden Variablen Deine Dateinamen aufbauen

SET /A Ausdruck

Die /A-Option gibt an, dass die Zeichenfolge rechts vom Gleichheitszeichen
ein numerischer Ausdruck ist, der ausgewertet wird.

Hilft Dir das weiter?
Bitte warten ..
Mitglied: Noobstar0815
25.04.2013 um 08:02 Uhr
Wenn ich da jetzt an den Kommentar von Pfordorf denke, weiß ich nicht, ob es wirklich ein numerischer Ausdruck ist, da "_" halt wirklich keine Zahl bzw kein numerischer Ausdruck ist :/
Bitte warten ..
Mitglied: Biber
25.04.2013, aktualisiert um 08:21 Uhr
Moin @Noobstar0815,

zum Thema Rausfieseln der numerischen Anteile aus dem Dateinamen hat doch @bastla oben schon alles geschrieben.
... 
for %%i in ("D:\Ordner mit vielen Dateien\*_*.*") do (  
    for /f "delims=_" %%z in ("%%~ni") do (  
      .....
Mit dem Ansatz von @joemouth liesse sich natürlich das (einmalige) Anlegen der Unterverzeichnisse vorab vom CMD-Prompt aus abfackeln.
Damit könnte im @bastla-Schnipsel die md-Zeile entfallen.

C:\Users\Biber>for /L %i in (0, 5000, 70000) do @echo md x:\subdir\%i 
md x:\subdir\0 
md x:\subdir\5000 
md x:\subdir\10000 
md x:\subdir\15000 
md x:\subdir\20000 
md x:\subdir\25000 
md x:\subdir\30000 
md x:\subdir\35000 
md x:\subdir\40000 
md x:\subdir\45000 
md x:\subdir\50000 
md x:\subdir\55000 
md x:\subdir\60000 
md x:\subdir\65000 
md x:\subdir\70000
hier nur mit "@echo" zur Demo; das muss zum Scharfschalten natürlich raus.

(Wobei dann natürlich der Batch auf die Schnauze fällt, wenn ein Verzeichnisname außerhalb des vorab angelegten Nummernkreises angesprochen wird.
Fällt aber in die Rubrik works as designed.)


Grüße
Biber
Bitte warten ..
Mitglied: Endoro
25.04.2013 um 08:31 Uhr
Hallo Noobstar0815,

Es geht ja nicht darum, 5000 Files in Folder zu verschieben.

Für die "for /l" Lösung würde noch eine weitere Forschleife benötigt, um die höchste Nr. zu ermitteln. Sonst läuft die ja ewig (oder man verlässt sich drauf, dass die Nrn. lückenlos sind).

Gruss!
Bitte warten ..
Mitglied: Noobstar0815
25.04.2013, aktualisiert um 08:57 Uhr
Könnte man es nicht auch n bissl aufwändiger mit if-Abfragen machen? So nach dem Motto wenn der erste teil des namens kleiner als 5000, 10000, 15000... ist verschiebe sie nach da und da? Oder benötigt man dafür die for-Schleife um den ersten Teil des Namens zu bekommen?
Bitte warten ..
Mitglied: joemouth
25.04.2013 um 09:26 Uhr
Hallo @ALL,

ich würde es so machen:

01.
@echo off 
02.
setlocal ENABLEEXTENSIONS 
03.
setlocal ENABLEDELAYEDEXPANSION 
04.
 
05.
cls 
06.
 
07.
set max1=20000 
08.
set s1=5000 
09.
 
10.
set max2=4999 
11.
set s2=1 
12.
 
13.
:: Zum Testen 
14.
set max1=200 
15.
set s1=50 
16.
 
17.
set max2=49 
18.
set s2=1 
19.
 
20.
FOR /L %%M IN (0,%s1%,%max1%) DO ( 
21.
    FOR /L %%N IN (0,%s2%,%max2%) DO ( 
22.
        set /A z=%%M + %%N 
23.
        echo move !z!_*.* %%M 
24.
25.
    )
Dann noch mkdir und if exist etc. einbauen

Was meint Ihr?
Bitte warten ..
Mitglied: Endoro
25.04.2013, aktualisiert um 10:41 Uhr
Zitat von joemouth:

Was meint Ihr?

KA, müsste man mal testen, was am schnellsten ist. Meine 50 ct:
01.
@echo off&setlocal enabledelayedexpansion 
02.
set /a pif=5000 &rem pattern in folder 
03.
for %%i in ("test\*_*") do ( 
04.
	set "name=%%~ni" 
05.
	set /a folder=(!name:~0,-2!/pif*pif+pif^) 
06.
	if not exist "test\!folder!" md "test\!folder!" 
07.
	move "%%~fi" "test\!folder!" 
08.
)
Gruss!


€dit: noch ein Typo korrigiert:
set /a folder=(!name:~0,-1!/pif*pif+pif^) <-- falsch
Bitte warten ..
Mitglied: joemouth
25.04.2013 um 09:53 Uhr
Zitat von Endoro:
01.
> ... 
02.
> set /a folder=(!name:~0,-1!/pif*pif+pif^) 
03.
> ...
Klasse Idee, besser als meine Lösung, die geht "über die Dörfer"
Bitte warten ..
Mitglied: bastla
25.04.2013, aktualisiert um 10:41 Uhr
Hallo Pjordorf!
Und da ein "_" eben keine gültige Zahl darstellt
... verwende ich es als Trennzeichen - davor steht in allen Beispieldateien eine gültige Zahl.
Hier hat ein mensch die Texte als Nummer interpretiert und diese dann Numerisch aufsteigend sortiert.
Das ja - ist aber irrelevant, da ja die Ordnernamen aus der Zahl berechnet werden ...

Grüße
bastla
Bitte warten ..
Mitglied: computerwuffi
25.04.2013 um 20:36 Uhr
Vielen Dank an alle die bei dieser regen Diskussion mit dabei waren. Ich habe heute, nachdem ich vorsichtshalber noch ein Backup gemacht habe, das Script von Endoro laufen lassen. Dort habe ich lediglich Zeile 5 abgeändert in: set /a folder=(!name:~0,-2!/pif*pif^), da ich ja mit Ordner 0 anfangen wollte.

Das Script habe ich vom übergeordneten Verzeichnis mit voll qualifizierten Pfaden gestartet,es lief perfekt durch. (ca 20. Minuten) Danach waren 859.437 Dateien in die richtigen Ordner einsortiert. (so viele, weil nach dem "_" noch bis zu 12 Untergruppen möglich sind)

Nochmal vielen Dank für die tolle Hilfe
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (21)

Frage von Xaero1982 zum Thema Microsoft ...

Windows Update
Treiberinstallation durch Windows Update läßt sich nicht verhindern (17)

Frage von liquidbase zum Thema Windows Update ...

Windows Tools
gelöst Aussendienst Datensynchronisierung (12)

Frage von lighningcrow zum Thema Windows Tools ...

Windows Server
RODC über VPN - Verbindung weg (10)

Frage von stefan2k1 zum Thema Windows Server ...