sirbubu
Goto Top

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

Content-ID: 155260

Url: https://administrator.de/contentid/155260

Ausgedruckt am: 23.11.2024 um 00:11 Uhr

60730
60730 17.11.2010 um 14:21:54 Uhr
Goto Top
moin und willkomen im Club,

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ß
60730
60730 17.11.2010 um 15:47:33 Uhr
Goto Top
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.

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.

Und ob man mit %2 überhaupt so spielen kann, gehört zu den Fragen, die ein Test erweisen würde face-wink

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ß
Biber
Biber 17.11.2010 um 16:34:50 Uhr
Goto Top
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.}

>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
60730
60730 17.11.2010 um 16:56:00 Uhr
Goto Top
face-wink

[OT]
Biber du alter einzeiler face-wink
Wenn ich ne Kappe auf hätte, die würde ich ziehen face-wink
[/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ß
Sirbubu
Sirbubu 17.11.2010 um 18:43:26 Uhr
Goto Top
Wow gleich soviele Antworten damit hätte ich nicht gerechnet face-big-smile
Danke

Ich werde morgen früh mal die Scripte ausprobieren und euch feedback geben.

Gruß

Sirbubu
Sirbubu
Sirbubu 19.11.2010 um 12:25:44 Uhr
Goto Top
Hi

habe eure Scripte gerade mal ausprobiert.
Komme leider mit keinem zu dem gewünschten ziel!
Das Problem bei den letzten 2 ist das ich keinen spezifische Dateiendung habe d.h die dateien heißen *.071[326CEEE1-BF40-412B-B454-A333ö2A776834]
wenn ich in den suffix ein * eintrage funzen die scripte irgenwie nichtmehr!
bin gerade am überlegen ob ich nicht mit Powershell und der Filesystemwatcher klasse eine überwachung des verzeichnises mache und bei änderung also Import einer datei eine andere reinkopiere!
Was haltet ihr davon?
Biber
Biber 19.11.2010 um 14:14:31 Uhr
Goto Top
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:

 :: 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
Sirbubu
Sirbubu 19.11.2010 um 16:17:36 Uhr
Goto Top
Jepp das klingt logisch mit den [ face-wink

habe jetzt ein Powershell script gemacht fällt mir irgendwie leichter von der Hand face-wink
Mach gleich mal nen Thread mit dem Powershell Script auf.

Gruß
GnozoNAV
GnozoNAV 24.08.2011 um 12:31:23 Uhr
Goto Top
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