Anzahl bestimmter Dateien per Batch verschieben
HI
ich habe einen Ordern mit ungefähr 90000 Dateien.
Diese dateien sind Rohdaten und müssen in ein Verzeichniss wo sie dann automatisch importiert werden.
Durch die große Anzahl benötigt natürlich der Importer ziemlich lange um sich alleine 1 File zu holen.
Daher würde ich gerne ein Batch haben das einfach eine bestimmte Anzahl von Dateien z.b 1000 in den Zielordner verschiebt!
Kann mir jemand von euch dabei helfen?
danke im vorraus
Sirbubu
ich habe einen Ordern mit ungefähr 90000 Dateien.
Diese dateien sind Rohdaten und müssen in ein Verzeichniss wo sie dann automatisch importiert werden.
Durch die große Anzahl benötigt natürlich der Importer ziemlich lange um sich alleine 1 File zu holen.
Daher würde ich gerne ein Batch haben das einfach eine bestimmte Anzahl von Dateien z.b 1000 in den Zielordner verschiebt!
Kann mir jemand von euch dabei helfen?
danke im vorraus
Sirbubu
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 155260
Url: https://administrator.de/forum/anzahl-bestimmter-dateien-per-batch-verschieben-155260.html
Ausgedruckt am: 23.12.2024 um 11:12 Uhr
9 Kommentare
Neuester Kommentar
moin und willkomen im Club,
UNGETESTET für ein deutsches OS geschrieben
UNGETESTET
Macht auch nix, zeigt potentielle Dateiverschiebungen nur an (echo in der letzten zeile entfernen)
Pfade selbstverfreilich frei erfunden jede Übereinstimmung mit lebenden Pfaden oder Personen sind rein zufällig.
Wie geschrieben UNGETESTETer Schnellschuss aus der Hüfte.
Gruß
UNGETESTET für ein deutsches OS geschrieben
rem logfile
set "log"=="%temp%\log.ini"
rem quelle definieren
set "quelle"=="c:\abc\def"
rem ziel definieren
set "ziel"=="c:\123\456\"
rem erstmal alle Treffer zusammenzählen
for /f %%a in ('dir /s %quelle%\*.* ^|find "Datei(en)"') do set files=%%a
rem "schwung" definieren:
set "minus"=="100"
rem Wenn mehr Treffer als abzuziehen sind ziehe (im Beispiel 100 von Variable ab. Sonst nicht.
if %files% leq %minus% (
set files=0
) else (
set /a files=%files%-%minus%
)
rem tempfiles schreiben
dir /b /s %quelle%\*.*>%log%
for /f %%a in ('"more +%files% %log%"') do echo move "%%a" %ziel%
pause
UNGETESTET
Macht auch nix, zeigt potentielle Dateiverschiebungen nur an (echo in der letzten zeile entfernen)
Pfade selbstverfreilich frei erfunden jede Übereinstimmung mit lebenden Pfaden oder Personen sind rein zufällig.
Was genau passiert, wenn du weniger Treffer hast, als abgezogen werden, dazu müßte man sich noch was ausdenken.
Wie geschrieben UNGETESTETer Schnellschuss aus der Hüfte.
Gruß
Oben siehst du, wie ich die Problematik lösen würde, wenn ich streng nach deiner Überschrift vorgehen würde.
Ich würde die Thematik aber anders lösen.
Wobei dieser Schnippsel eine Datei nach der anderen verschiebt und zwischen den verschiebeaktionen eine gewisse Zeit (die abhängig von der Dateigröße ist) pausiert.
Ob die Dateigröße nun durch 10; 100 oder gar 1000 geteilt werden soll, das kann ich dir nicht sagen -dazu kennen wir deinen Importjob nicht.
Und wieder einmal hab ich Bastlas call :processlines benutzt.
Jedoch "spinnt" diese Version, wenn du Dateien/Ordner mit ! Sonderzeichen hast.
Und ob man mit %2 überhaupt so spielen kann, gehört zu den Fragen, die ein Test erweisen würde
Der Votril, den ich in diesem Ansatz sehe ist - wenn der Import nicht auf dem Rechner läuft, den das Script laufen läßt dann sparst du einiges an Zeit - sehr wahrscheinlich läuft der Import sauberer ab, wenn nur eine Datei nach der nächsten rein kommt und das script kann einmal gestartet werden und beendet sich dann, wenn keine Dateien mehr da sind.
Der erste Ansatz müßte ja eine goto schleife bekommen und die hab ich absichtlich nicht reingebaut, denn ich kenne den zeitbedarf nicht, wann der nöchste 1.000er Block in den Ordner darf.
All das und das, was noch von einem /beiden Bs aus dem B Bereich kommen wird solltest du beachten.
Gruß
Ich würde die Thematik aber anders lösen.
set "quelle"=="c:\abc\def"
set "ziel"=="c:\123\456\"
set "suffix"=="pdf"
for /R %%quelle%\ %%a in (*.%suffix%) do (
for /f "tokens=3" %%i in ('dir /-C "%%a" ^| find ".%suffix%" ') do call :processlines %%a %%i
)
goto end
:processlines
set /a "wait"="%2" / 100
echo move %1 %ziel%\ && ping -n %wait% localhost>nul
:eof
:end
Wobei dieser Schnippsel eine Datei nach der anderen verschiebt und zwischen den verschiebeaktionen eine gewisse Zeit (die abhängig von der Dateigröße ist) pausiert.
Ob die Dateigröße nun durch 10; 100 oder gar 1000 geteilt werden soll, das kann ich dir nicht sagen -dazu kennen wir deinen Importjob nicht.
Und wieder einmal hab ich Bastlas call :processlines benutzt.
Jedoch "spinnt" diese Version, wenn du Dateien/Ordner mit ! Sonderzeichen hast.
Der Votril, den ich in diesem Ansatz sehe ist - wenn der Import nicht auf dem Rechner läuft, den das Script laufen läßt dann sparst du einiges an Zeit - sehr wahrscheinlich läuft der Import sauberer ab, wenn nur eine Datei nach der nächsten rein kommt und das script kann einmal gestartet werden und beendet sich dann, wenn keine Dateien mehr da sind.
Der erste Ansatz müßte ja eine goto schleife bekommen und die hab ich absichtlich nicht reingebaut, denn ich kenne den zeitbedarf nicht, wann der nöchste 1.000er Block in den Ordner darf.
All das und das, was noch von einem /beiden Bs aus dem B Bereich kommen wird solltest du beachten.
Gruß
Moin Sirbubu,
ich würde es von der Strategie her schon ähnlich machen wie T-Mo.
Allerdings würde ich auf eine selbst definierte und hochgezählte Set /a -Variable verzichten und diese Übung vom Standardprogramm Find.exe abkaspern lassen.
Demo am CMD-Prompt:
[Input ist die erste Zeile gekennzeichnet durch den ">"-Prompt. dieses ">"-Zeichen NICHT mit eingeben.}
Erläuterung:/Annahmen.
Grüße
Biber
ich würde es von der Strategie her schon ähnlich machen wie T-Mo.
Allerdings würde ich auf eine selbst definierte und hochgezählte Set /a -Variable verzichten und diese Übung vom Standardprogramm Find.exe abkaspern lassen.
Demo am CMD-Prompt:
[Input ist die erste Zeile gekennzeichnet durch den ">"-Prompt. dieses ">"-Zeichen NICHT mit eingeben.}
>For /F "delims=[] tokens=1,2" %i in ('dir /a:-d /b F:\Schnipsel\*.txt^|find /i /n ".txt"') do @if %i LSS 77 @ECHO %i move "F:\Schnipsel\%j" C:\Zielverzeichnis\
1 move "F:\Schnipsel\namen.txt" C:\Zielverzeichnis\
2 move "F:\Schnipsel\PasswordneverExpires_vbs.txt" C:\Zielverzeichnis\
3 move "F:\Schnipsel\scanlog.txt" C:\Zielverzeichnis\
4....
.... usw.
77 ...
Erläuterung:/Annahmen.
- Alle Dateien ("deine 90000") liegen in meinem Beispiel im Verzeichnis "F:\Schnipsel" und erfüllen die Namenskonvention "*.txt"
- Zielverzeichnis ist "C:\Zielverzeiochnis"
- als proof-of-concept-Ausgabe wird der MOVE-Befehl nur mit @echo ausgegeben, nicht aber ausgeführt
- zusätzlich nur zur Visualisierung des Zählers %i, der bei mir das Limit "77" statt "1000" hat --> wird der Wert von %i mit ausgegeben.
Grüße
Biber
[OT]
Biber du alter einzeiler
Wenn ich ne Kappe auf hätte, die würde ich ziehen
[/OT]
Nur der Vollständigkeit halber:
- Falls der Bibersche Schnippsel in eine Batch gepackt werden soll - was ich an deiner Stelle machen würde- spendiere jedem einzelnen % einen Zwilling (%%).
Gruß
Moin Sirbubu,
ja nee... is' klar.
Damit habe ich natürlich nicht gerechnet, dass eckige Klammern im Dateinamen bzw. in der Endung enthalten sind, als ich als Token-Trenner die Zeichen "[" und "]" gewählt habe.
Wenn deine Dateien jetzt beispielsweise der Namenskonvention "Dateiendung enthält u.a. eine Eckige-Klammer-Auf=='[' " entsprechen, dann muttu anpassen:
...wird jetzt zu
Zu Teil b) der Frage, ob du nicht besser mit der PowerShell etc.... Warum nicht?
Einzige Bitte dann: Mach hier einen Haken dran und lass uns die neue Variante in einem neuen Beitrag abfriemeln.
Grüße
Biber
ja nee... is' klar.
Damit habe ich natürlich nicht gerechnet, dass eckige Klammern im Dateinamen bzw. in der Endung enthalten sind, als ich als Token-Trenner die Zeichen "[" und "]" gewählt habe.
Wenn deine Dateien jetzt beispielsweise der Namenskonvention "Dateiendung enthält u.a. eine Eckige-Klammer-Auf=='[' " entsprechen, dann muttu anpassen:
:: Demo am CMD-Prompt BISHER:
For /F "delims=[] tokens=1,2" %i in ('dir /a:-d /b F:\Schnipsel*.txt^|find /i /n ".txt"') do @if %i LSS 77 @ECHO %i move "F:\Schnipsel\%j" C:\Zielverzeichnis
...wird jetzt zu
For /F "delims= tokens=1,*" %i in ('dir /a:-d /b F:\Schnipsel*.*[*^|find /i /n "["') do @if %i LSS 77 ......{whatever}
- Statt nach "*.txt" suche ich jetzt nach allen Dateien "*.*[*" (==Extension enthält eine Eckige-Klammer-Auf )
- Statt "Delims=[] tokens=1,2" , also einer Annahme "Es gibt nur 2 Zeilen-Teile maximal" Jetzt--> "Tokens=1,*" --> Es gibt Token1 und den Rest
- Statt bisher "FindStr ".txt" dann natürlich auch "FindStr "[" (= suche die Eckige-Klammer-Auf]
Zu Teil b) der Frage, ob du nicht besser mit der PowerShell etc.... Warum nicht?
Einzige Bitte dann: Mach hier einen Haken dran und lass uns die neue Variante in einem neuen Beitrag abfriemeln.
Grüße
Biber
Hallo,
Ich habe fast das selbe Problem, nur hab ich echt keine Ahnung von Batch programmierung und hoffe, dass ihr mir hier weiterhelfen könnt.
Ich habe um die 63000 .htm Files in dem Ordner "C:\MyHTMLHelp\Project\addin_a\Source" und möchte nun alle Dateien in Unterordner aufteilen. Jeder ordner sollte 600 .htm Files beinhalten. Bis auf den letzten, da ist es logisch, dass es nicht genau 600 sein können. Ist aber kein Problem.
Also:
600 htm Files in den Ordner "C:\MyHTMLHelp\Project\addin_a\Source\Ordner1"
600 htm Files in den Ordner "C:\MyHTMLHelp\Project\addin_a\Source\Ordner2"
...
usw.
Es muss aber beachtet werden, dass die Unterordner noch nicht existieren. Also muss ein neuer Ordner quasi in dem Verzeichnis "C:\MyHTMLHelp\Project\addin_a\Source" angelegt werden und dort dann die 600 Files eingeschoben werden.
Wäre super, wenn sich da jemand kurz zeit nehmen könnte. Bis jetzt hab ich es nur geschafft alle Dateien in einen Ordner zu schieben. Das mit der abzählung das nach 600 schluss ist, hab ich nicht hinbekommen. Auch das erstellen eines neuen Ordners ist mir noch nicht so ganz klar.
Also vielleicht hat ja jemand die Zeit und bastelt so einen kleinen Batch kurz und kann mir noch erklären, was er pro Code zeile genau macht, denn einfach nur die .bat ausführen hat ja nun auch keinen großen Lerneffekt.
Mit freundlichen Grüßen
Lukas Patz
Ich habe fast das selbe Problem, nur hab ich echt keine Ahnung von Batch programmierung und hoffe, dass ihr mir hier weiterhelfen könnt.
Ich habe um die 63000 .htm Files in dem Ordner "C:\MyHTMLHelp\Project\addin_a\Source" und möchte nun alle Dateien in Unterordner aufteilen. Jeder ordner sollte 600 .htm Files beinhalten. Bis auf den letzten, da ist es logisch, dass es nicht genau 600 sein können. Ist aber kein Problem.
Also:
600 htm Files in den Ordner "C:\MyHTMLHelp\Project\addin_a\Source\Ordner1"
600 htm Files in den Ordner "C:\MyHTMLHelp\Project\addin_a\Source\Ordner2"
...
usw.
Es muss aber beachtet werden, dass die Unterordner noch nicht existieren. Also muss ein neuer Ordner quasi in dem Verzeichnis "C:\MyHTMLHelp\Project\addin_a\Source" angelegt werden und dort dann die 600 Files eingeschoben werden.
Wäre super, wenn sich da jemand kurz zeit nehmen könnte. Bis jetzt hab ich es nur geschafft alle Dateien in einen Ordner zu schieben. Das mit der abzählung das nach 600 schluss ist, hab ich nicht hinbekommen. Auch das erstellen eines neuen Ordners ist mir noch nicht so ganz klar.
Also vielleicht hat ja jemand die Zeit und bastelt so einen kleinen Batch kurz und kann mir noch erklären, was er pro Code zeile genau macht, denn einfach nur die .bat ausführen hat ja nun auch keinen großen Lerneffekt.
Mit freundlichen Grüßen
Lukas Patz