Batch zum Verschieben numerisch benannter Dateien möglich?
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!
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!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 205601
Url: https://administrator.de/contentid/205601
Ausgedruckt am: 20.11.2024 um 15:11 Uhr
17 Kommentare
Neuester Kommentar
Hallo,
Nein, laut deinem beispiel eben nicht im gleichen Aufbau.
Und diese sind eben anders aufgebaut
Und diese wiederum anders aufgebaut
Gruß,
Peter
Nein, laut deinem beispiel eben nicht im gleichen Aufbau.
100_1.txt
100_2.jpg
300_4.jpg
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
@ Pjordorf
Die Beispiele weisen mE durchaus auf eine Gemeinsamkeit hin, daher könnte ein Batch schematisch etwa so aussehen:
Solange die beiden "
Grüße
bastla
Die Beispiele weisen mE durchaus auf eine Gemeinsamkeit hin, daher könnte ein Batch schematisch etwa so aussehen:
@echo off & setlocal
for %%i in ("D:\Ordner mit vielen Dateien\*_*.*") do (
for /f "delims=_" %%z in ("%%~ni") do (
set /a Ordner=%%z / 5000 * 5000
setlocal enabledelayedexpansion
echo md "D:\Ordner mit vielen Dateien\!Ordner!" 2>nul
echo move "%%i" "D:\Ordner mit vielen Dateien\!Ordner!"
endlocal
)
)
pause
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
Hallo computerwuffi und willkommen im Forum!
Grüße
bastla
... 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
Hi bastler,
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
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
[OT]
Willkommen im Forum.
Biber
[/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. Das Forum habe ich schon zu meiner Favoriten-Liste hinzugefügt, es ist echt interessant und sehr gut moderiert.
Willkommen im Forum.
Biber
[/OT]
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?
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?
Moin @Noobstar0815,
zum Thema Rausfieseln der numerischen Anteile aus dem Dateinamen hat doch @bastla oben schon alles geschrieben.
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.
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
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
(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
Hallo @all,
ich würde es so machen:
Dann noch mkdir und if exist etc. einbauen
Was meint Ihr?
ich würde es so machen:
@echo off
setlocal ENABLEEXTENSIONS
setlocal ENABLEDELAYEDEXPANSION
cls
set max1=20000
set s1=5000
set max2=4999
set s2=1
:: Zum Testen
set max1=200
set s1=50
set max2=49
set s2=1
FOR /L %%M IN (0,%s1%,%max1%) DO (
FOR /L %%N IN (0,%s2%,%max2%) DO (
set /A z=%%M + %%N
echo move !z!_*.* %%M
)
)
Dann noch mkdir und if exist etc. einbauen
Was meint Ihr?
KA, müsste man mal testen, was am schnellsten ist. Meine 50 ct:
@echo off&setlocal enabledelayedexpansion
set /a pif=5000 &rem pattern in folder
for %%i in ("test\*_*") do (
set "name=%%~ni"
set /a folder=(!name:~0,-2!/pif*pif+pif^)
if not exist "test\!folder!" md "test\!folder!"
move "%%~fi" "test\!folder!"
)
Gruss!
€dit: noch ein Typo korrigiert:
set /a folder=(!name:~0,-1!/pif*pif+pif^) <-- falsch
> ...
> set /a folder=(!name:~0,-1!/pif*pif+pif^)
> ...
Klasse Idee, besser als meine Lösung, die geht "über die Dörfer"
Hallo Pjordorf!
Grüße
bastla
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