rallelin
Goto Top

Begrenzte Anzahl von Dateien verschieben

Moin moin werte Leser,
als Kaufmann, der sich eher selten in der Bash umtut, fehlt mir leider der Durchblick, das nachfolgende Problem in den Grifff zu bekommen.
Wenn jemand eine entsprechende Idee zur Lösung hat, würde ich mich über eine Rückmeldung sehr freuen und danke schon jetzt...

Szenario:
Es existiert ein Verzeichnis mit einer hohen, jedoch unbestimmten Anzahl von Dateien (alles xml), die blockweise (z.B. jeweils 5 Dateien)
in ein anderes Verzeichnis verschoben werden sollen, um dort von einem anderen Programm weiter verarbeitet werden zu können.
Cron-gesteuert wird dann nach der Weiterverarbeitung der nächste Block verschoben.

Das äussere Gerüst steht schon und ist ausgetestet - jetzt muss ich nur noch die 5 Dateien irgendwie verschoben bekommen.
Anfangs dachte ich, es könnte mit einer Schleife per "for i in ..." funktionieren. Allerdings hält die Variable dann jedoch *alle* Dateinamen.
Obwohl ich noch nie mit Arrays experimentiert habe, glaube ich, dass die Fragestellung hierüber erledigt werden könnte...

Content-Key: 148969

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

Printed on: April 23, 2024 at 12:04 o'clock

Member: pieh-ejdsch
pieh-ejdsch Aug 13, 2010 at 23:12:50 (UTC)
Goto Top
moin rallelin und Willkommen im Forum

wenn die Dateizahl ins unbekannte geht würde ich mit einer Liste Arbeiten.

diese Liste wird erstellt, wenn noch keine Vorhanden ist
die Anzahl kann ausgewählt werden
wenn die Liste Leer bzw nicht mehr da ist - wird automatisch eine neue angelegt

Vorteil: das Verzeichnis wird nicht jedesmal neu durchgeackert
Nachteil: wenn neue Dateien ins Verzeichnis kommen werden diese erst abgearbeitet wenn die Liste durch ist (kann natürlich auch ein Vorteil sein je nach dem)
::----snipp----Dateien-Blockweise-verschieben
@echo Off
set Woher="D:\ein Verzeichnis"  
set "Dorthin=D:\das andere Verzeichnis"  
set "Dateityp=*.xml"  

pushD %Woher%

del "%temp%\tmp" 2>nul  
if exist "%temp%\tmp2" (move "%temp%\tmp2" "%temp%\tmp">nul ) else dir /b %Dateityp%>"%temp%\tmp"  

::Der Parameter enspricht den Maximalen BlockVerschub ( call :move 10 )entspricht Maximal 10 Dateien
call :move 5
popD
goto :eof


:move
set "Nr=1"  
:: zum scharfmachen das @ECHO entfernen
for /f "usebackq delims=" %%i in ("%temp%\tmp") do (@ECHO move "%%i" "%Dorthin%\"  
	setlocal enabledelayedexpansion
	if !Nr! == %1 endlocal & set "Nr=1"&more +%1 "%temp%\tmp">"%temp%\tmp2"&goto :eof  
	endlocal & set /a Nr+=1
)
::----snapp----Dateien-Blockweise-verschieben

Gruß Phil
Member: rallelin
rallelin Aug 14, 2010 at 04:46:26 (UTC)
Goto Top
Hallo Phil,

danke für Deine Mühe.
Sieht für mich aus, als wäre das ein Batch (call, goto usw.) - hilft mir in der Bash (#!/bin/bash) daher nur bedingt weiter.
Mal schauen, ob ich das irgendwie angepasst bekomme...

Nochmals danke,
Ralf

Nachtrag (16.08.2010): Problem wurde mit einem zweiten Script "umgangen";
das Shell-Script arbeitet wie bisher und übergibt an ein gesondertes Perl-Script,
welches über 'readdir' und 'rename' die noch ausstehende Aktion durchführt.