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

Anzahl bestimmter Dateien per Batch verschieben

Frage Entwicklung Batch & Shell

Mitglied: Sirbubu

Sirbubu (Level 1) - Jetzt verbinden

17.11.2010 um 13:55 Uhr, 7733 Aufrufe, 9 Kommentare

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
Mitglied: 60730
17.11.2010 um 14:21 Uhr
moin und willkomen im Club,

UNGETESTET für ein deutsches OS geschrieben

01.
rem logfile 
02.
set "log"=="%temp%\log.ini" 
03.
rem quelle definieren 
04.
set "quelle"=="c:\abc\def" 
05.
rem ziel definieren 
06.
set "ziel"=="c:\123\456\" 
07.
 
08.
rem erstmal alle Treffer zusammenzählen 
09.
for /f %%a in ('dir /s %quelle%\*.* ^|find "Datei(en)"') do set files=%%a 
10.
rem "schwung" definieren: 
11.
set "minus"=="100" 
12.
 
13.
rem Wenn mehr Treffer als abzuziehen sind ziehe (im Beispiel 100 von Variable ab. Sonst nicht. 
14.
if %files% leq %minus% ( 
15.
                        set files=0 
16.
             ) else ( 
17.
                        set /a files=%files%-%minus% 
18.
19.
 
20.
rem tempfiles schreiben 
21.
dir /b /s %quelle%\*.*>%log% 
22.
for /f %%a in ('"more +%files% %log%"') do echo move "%%a" %ziel% 
23.
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ß
Bitte warten ..
Mitglied: 60730
17.11.2010 um 15:47 Uhr
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.

01.
set "quelle"=="c:\abc\def" 
02.
set "ziel"=="c:\123\456\" 
03.
set "suffix"=="pdf" 
04.
 
05.
for /R %%quelle%\ %%a in (*.%suffix%) do ( 
06.
		for /f "tokens=3" %%i in ('dir /-C "%%a" ^| find ".%suffix%" ') do call :processlines %%a %%i 
07.
08.
goto end 
09.
 
10.
:processlines 
11.
set /a "wait"="%2" / 100 
12.
echo move %1 %ziel%\ && ping -n %wait% localhost>nul 
13.
:eof 
14.
 
15.
: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

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ß
Bitte warten ..
Mitglied: Biber
17.11.2010 um 16:34 Uhr
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
Bitte warten ..
Mitglied: 60730
17.11.2010 um 16:56 Uhr


[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ß
Bitte warten ..
Mitglied: Sirbubu
17.11.2010 um 18:43 Uhr
Wow gleich soviele Antworten damit hätte ich nicht gerechnet
Danke

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

Gruß

Sirbubu
Bitte warten ..
Mitglied: Sirbubu
19.11.2010 um 12:25 Uhr
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?
Bitte warten ..
Mitglied: Biber
19.11.2010 um 14:14 Uhr
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
Bitte warten ..
Mitglied: Sirbubu
19.11.2010 um 16:17 Uhr
Jepp das klingt logisch mit den [

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

Gruß
Bitte warten ..
Mitglied: GnozoNAV
24.08.2011 um 12:31 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

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
Suche passender Treiber (12)

Frage von stolli zum Thema Windows Server ...