sugram
Goto Top

Batch Eine bestimmte Anzahl von Dateien kopieren, Zielordne ist aber leer

Hallo

Ich hoffe das hier mir jemand weiterhelfen kann face-smile

Folgendes Problem.

Ich habe hier mehrere Ordner in denen immer neue Bilder reinkommen. Diese werden für uns für eine Analyse benötigt.
Da man aber meist nicht alle benötigt, sondern nur die letzten 20 oder 30 neuesten, dachte ich ich löse das mit ner Batch,
Allerdings bin ich da jetzt an meine Grenzen gestoßen.
Somit, ist es möglich von mehreren Ordnern nur die letzten 20 neuesten Dateien zu kopieren, wobei der Zielordner leer ist?!

Vielen Dank schon mal.
Kommentar vom Moderator Biber am 26.02.2012 um 14:17:40 Uhr
Verschoben von "Tools & Utilities" nach "Batch & Shell".

Content-ID: 180801

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

Ausgedruckt am: 17.11.2024 um 19:11 Uhr

105215
105215 21.02.2012 um 09:15:58 Uhr
Goto Top
Moin,

ich würde dies via robocopy machen. An diesem Thema Robocopy bin ich auch gerade dran!!! Das Tool ist echt super und dort kannst duch da es sich am Besten mit cmd Befehlen handelt kannst du die Befehle direkt in ein Batch eingeben.

Gruß
Karsten
60730
60730 21.02.2012 um 10:05:33 Uhr
Goto Top
moin,

Somit, ist es möglich von mehreren Ordnern nur die letzten 20 neuesten Dateien zu kopieren, wobei der Zielordner leer ist?!

Yupp das ist durchaus möglich, allerdings würde ich die Reihenflge umdrehen und die ersten Treffer solange kopieren, bis 20 erreicht ist.

PS:
Sicherlich willst du das per Batch erledigen, also wäre die Fragestellung besser unter Batch aufgehoben.
bastla
bastla 21.02.2012 um 11:42:28 Uhr
Goto Top
Hallo sugram und willkommen im Forum!

Sollte sich (ungetestet) etwa so machen lassen:
@echo off & setlocal
set "Quelle=D:\Ordner mit neuen Bildern"  
set "Typ=jpg"  
set "Ziel=D:\Zielordner"  
set /a Anzahl=20

pushd "%Quelle%"  
for /f "delims=" %%i in ('dir /b /o-d *.%Typ%') do call :ProcessFile "%%i"  
popd
goto :eof

:ProcessFile
set /a Anzahl-=1
if %Anzahl% geq 0 copy %1 "%Ziel%"  
goto :eof
Grüße
bastla
pieh-ejdsch
pieh-ejdsch 21.02.2012 um 13:28:32 Uhr
Goto Top
moin,

das geht sogar auch ohne Unterprogram:
auch in der CMD-Line

wobei der Zielordner leer ist?!
@echo off & setlocal
set "Quelle=D:\Ordner mit neuen Bildern"  
set "Typ=jpg"  
set "Ziel=D:\Zielordner"  
if exist "%Ziel%\*%Typ%" exit /b 1  
set /a Anzahl=20

pushd "%Quelle%"  
set /a x=Anzahl+1
(for /f "delims=" %%i in ('dir /b /o-d *.%Typ%') do @set /a x-=1,y=1/x &&>&3  copy "%%i" "%Ziel%" || set /a x=1) >nul 2>nul  
popD

[Edit]
hinweis von bastla - berichtigt.
[/Edit]

Gruß Phil
bastla
bastla 21.02.2012 um 17:57:56 Uhr
Goto Top
@ph
das geht sogar auch ohne Unterprogram
... aber wohl doch nur mit %Typ% face-wink

Ansonsten tut's auch:
for /f "tokens=1* delims=:" %%i in ('dir /b /o-d *.%Typ%^|findstr /n "^"') do if %%i leq %Anzahl% copy "%%j" "%Ziel%"

Grüße
bastla
sugram
sugram 22.02.2012 um 13:00:23 Uhr
Goto Top
VIELEN VIELEN Dank euch allen!

Ich habe das Programm ohne Unterprogramm getestet und funktioniert klasse!
Nur eine Frage habe ich hierzu, das kopieren / suchen dauert da schon lange. Habe für 5 Dateien ca 30 -40 sec gebraucht.

Gruß sugram

P.S.: Ich bin dennoch happy und schmeiß mal ne runde face-wink)
bastla
bastla 22.02.2012 um 13:12:39 Uhr
Goto Top
Hallo sugram!
Habe für 5 Dateien ca 30 -40 sec gebraucht.
Ich kann mir eigentlich nicht vorstellen, dass das am Batch liegt - auch wenn Du meine zuletzt gepostete Zeile als Ersatz der Zeile 8 im ursprünglichen Batch verwendest (die Zeilen 12 bis 15 werden dann nicht mehr benötigt) und damit testest, sollte es keinen nennenswerten Unterschied in der Laufzeit geben ...

Wie viele Bilder befinden sich denn im fraglichen Ordner, und wo liegt dieser (auf einer lokalen Platte oder auf einem Netzlaufwerk / NAS)?

Grüße
bastla
sugram
sugram 22.02.2012 um 13:37:49 Uhr
Goto Top
Hallo

Nun die Bilder liegen auf einem Netzlaufwerk, die Anzahl der Bilder kann hier schon mal auf 1000 oder mehr ansteigen. Ich denke das es dann daran liegen wird.
Immerhin funktioniert das ganze, dann muß man halt warten face-smile

Gruß sugram
sugram
sugram 22.02.2012 um 22:55:20 Uhr
Goto Top
So, hätte doch noch eine Frage dazu und hoffe, daß diese auch beantwortet werden kann.

Die Lösung ist ja so konzipiert, daß der exakte Zielpfad als Quelle angegeben wird.
Ich veranschauliche mal mein "Problem"
Die Bilder sind von einem Objekt mit 6 Seiten, von jeder Seite existieren Bilder. Natürlich brauch ich alle Bilder von allen Seiten. Dabei ist die Ordnerstruktur so aufgebaut:

\\share\Objekt1\seite1
\\share\Objekt1\seite2
\\share\Objekt1\seite3
usw.

mir dir /s bekomme ich dann zwar das Directorylisting unter objekt1 hin, aber wie veranlasse ich dann xcopy / copy das noch in das richtige Unterverzeichnis zu kopieren?

Danke schon mal im voraus
bastla
bastla 22.02.2012 um 23:02:17 Uhr
Goto Top
Hallo sugram!

Ungetestet etwa so:
@echo off & setlocal
set "Quelle=\\share\Objekt1"  
set "Typ=jpg"  
set "Ziel=D:\Zielordner"  
set /a Anzahl=20

for /d %%a in ("%Quelle%\*") do for /f "tokens=1* delims=:" %%i in ('dir /b /o-d "%%a\*.%Typ%"^|findstr /n "^"') do if %%i leq %Anzahl% xcopy "%%a\%%j" "%Ziel%\%%~nxa\"  
Zielordner wären in diesem Fall "D:\Zielordner\seite1", "D:\Zielordner\seite2", ... und kopiert werden jeweils 20 Dateien ...

Grüße
bastla
sugram
sugram 26.02.2012 um 09:50:59 Uhr
Goto Top
Vielen Dank, klappt wunderbar!


Dennoch eine Frage, der String arbeitet ja dann das ganze Verzeichnis durch. Also wenn 1000 Dateien enthalten sind, dann kann das dauern.
Wäre es möglich das er dann nach 20 einfach abbricht, da ja die Anzahl schon erreicht ist.

Ich glaube langsam ich nerve euch, aber ich bekomme das leider nicht hin.

Gruß sugram
60730
60730 26.02.2012 um 12:06:47 Uhr
Goto Top
Zitat von @sugram:
Vielen Dank, klappt wunderbar!
Ich glaube langsam ich nerve euch, aber ich bekomme das leider nicht hin.

Moin,
Wenn du mich damit meinst, ja - denn ich schrieb dir gleich verschiebe die frage nach batch & shell.

Und was deinen aenderungswunsch angeht,


Edit so viel lesen musst du garnicht, denn achon seine erste antwort zielt genau dahin.

Versuche mal ein paar geloeste threads vom bastla anzusehen, er arbeitet gerne mit unterprogrammen.

Mit anderen worten,, jetzt kaut er (die batch) Alles durch und mit einer simplen anpassung koennte die locker alles unter 20 abarbeiten und dann abbrechen.

Dazu musst du aber jeden ordner seperat ansprechen und nicht wie jetzt einen samt unterordnern.

Also versuch mal, meinen vorschlaegen zu folgen, denn wir koennen das-aber davon lernst du nix.
Und dann finde ich es immer schade, wenn man versucht den fragestellern einen tipp zu geben und wenn man dan merken darf, das der in den wind geschrieben wird- hat man(ich) keine lust mehr.

Gruss

Gruss
sugram
sugram 26.02.2012 um 12:40:17 Uhr
Goto Top
Das war allgemein gemeint.

Ich versuche das ich das hin bekomme. Denn ich kann dich / euch schon verstehen wenn keine Lust mehr habt, weil ihr damit richtig liegt, daß man so nix lernt.
Wie ist es denn meistens, die Lösung ist manchmal so einfach, aber man sieht sie nicht, weil man zu kompliziert denkt.

Also nicht's für ungut ich danke euch ALLEN!


Gruß sugram
bastla
bastla 26.02.2012, aktualisiert am 18.10.2012 um 18:50:08 Uhr
Goto Top
@t-mo
Das Abbrechen von Schleifen ist so eine Sache für sich ...

Ich würde eher zu einem anderen Ansatz (dem Gegenteil Deiner ursprünglichen Idee) greifen - ungetestet etwa so:
@echo off & setlocal
set "Quelle=\\share\Objekt1"  
set "Typ=jpg"  
set "Ziel=D:\Zielordner"  
set /a Anzahl=20

for /d %%a in ("%Quelle%\*") do call :ProcessDir "%%a"  
goto :eof

:ProcessDir
set /a Skip=0
for /f %%i in ('dir "%~1\*.%Typ%"^|findstr "Datei(en)" 2^>nul') do set /a Skip=%%i - Anzahl  
if %Skip% lss 0 set /a Skip=0
for /f "delims=" %%i in ('dir /b /od /a-d "%~1\*.%Typ%"^|more +%Skip%') do xcopy "%~1\%%i" "%Ziel%\%~nx1\"  
goto :eof
Aus edukativen Gründen verzichte ich (vorläufig) auf eine Erkklärung der Vorgangsweise ... face-wink

Grüße
bastla
sugram
sugram 02.03.2012 um 06:40:24 Uhr
Goto Top
@bastla

VIELEN DANK!!

Klappt wunderbar, mußte nur den String "Datei(en)" in "File(s) ändern.