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-ID: 148969

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

Ausgedruckt am: 23.11.2024 um 10:11 Uhr

pieh-ejdsch
pieh-ejdsch 14.08.2010 um 01:12:50 Uhr
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
rallelin
rallelin 14.08.2010 um 06:46:26 Uhr
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.