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

Nur Ordner kopieren, die Dateien enthalten junger als...

Frage Entwicklung Batch & Shell

Mitglied: Vanessa

Vanessa (Level 1) - Jetzt verbinden

03.06.2011, aktualisiert 04.06.2011, 6006 Aufrufe, 6 Kommentare

Hallo Leute,

ich versuche diesen Ablauf per Batch zu lösen, kriege es aber nicht hin. Kann mir jemand vielleicht helfen?

Ausgangsituation:
In einem Ordner sind mehrere Ordner enthalten. (Sie haben alle einen Namensmuster, z.B. "deploy_...")

Ziel:
Von diesen Ordner nur diejenigen zu kopieren (komplett, mit dem gesammten Inhalt und Struktur), welche innerhalb von einem der Unterverzeichnisse mindestens eine Datei enthalten, die junger ist als vorgegebener Parameter (ein Datum).

Hat jemand eine Idee?
Mitglied: Friemler
03.06.2011 um 11:51 Uhr
Hallo Vanessa,

der Titel Deiner Frage "Nur Ordner kopieren, die Dateien enthalten älter als..." wieder spricht der Aussage "Von diesen Ordner nur diejenigen zu kopieren (komplett, mit dem gesamten Inhalt und Struktur), welche innerhalb von einem der Unterverzeichnisse mindestens eine Datei enthalten, die junger ist als vorgegebener Parameter (ein Datum)". Was denn nun?

Auf welcher Ebene der Verzeichnisstruktur soll denn geprüft werden, ob es Dateien gibt, die das Datumskriterium (wenn das denn mal eindeutig festgelegt ist) erfüllen?

Auf welchem/n Betriebssystem(en) soll das Script laufen?

Warum willst Du eine komplette Verzeichnisstruktur kopieren, wenn nur eine Datei irgendwo darin das Datumskriterium erfüllt?

Gruß
Friemler
Bitte warten ..
Mitglied: Vanessa
04.06.2011 um 15:08 Uhr
Hallo Friemler,

danke für Feedback! Sorry, gestern war ein verrückter Tag. ;)

der Titel Deiner Frage "Nur Ordner kopieren, die Dateien enthalten älter als..." wieder spricht der Aussage..
Was denn nun?


Bereits korrigiert. "junger" natürlich, danke für die Aufmerksammkeit!

Auf welcher Ebene der Verzeichnisstruktur soll denn geprüft werden, ob es Dateien gibt, die das Datumskriterium (wenn das denn mal eindeutig festgelegt ist) erfüllen?

Variabel. Auf allen im jeweilinen Ordner vorhandenen Ebenen.

Auf welchem/n Betriebssystem(en) soll das Script laufen?

Win XP, SP 3

Warum willst Du eine komplette Verzeichnisstruktur kopieren, wenn nur eine Datei irgendwo darin das Datumskriterium erfüllt?

Hm.. eine gute Frage. Die Verzeichnisse sind Deploy-Ordner von einem Test-System.
Sie könnten theoretisch Dateien enthalten, die früher geändert wurden, als der Parameter angibt, sollen aber beim späteren Vergleich mit dem Live-Stand nicht verloren gehen. Dieses ist aber eher eine zusätzliche Sicherheitsmassnahme, die wünschenswert, aber nicht obligatorisch ist, wenn man mit dem Datum-Parameter aufmerksam umgeht. Vielleicht hast Du Recht: es würde reichen, wenn nur die entsprechende Dateien kopiert werden. Beim richtig angegenenen Datum-Parameter werden es sowieso alle sein, stimmt? Wichtig dabei ist, dass die Ordner-Struktur beibehalten wird.

Ich denke dabei an xcopy (mit /d und /s Options) und innere for-Schleifen, kriege es alleine aber noch nicht hin.
Bitte warten ..
Mitglied: Friemler
04.06.2011 um 17:12 Uhr
Hallo Vanessa,

teste mal das hier:
01.
@echo off 
02.
 
03.
setlocal 
04.
 
05.
 
06.
set "SrcDir=%~1" 
07.
set "DestDir=%~2" 
08.
 
09.
for /f "eol= tokens=1-3 delims=." %%d in ("%~3") do ( 
10.
  set "Day=%%d" 
11.
  set "Month=%%e" 
12.
  set "Year=%%f" 
13.
14.
 
15.
set "YoungerThan=%Month%-%Day%-%Year%" 
16.
 
17.
 
18.
for /d %%d in ("%SrcDir%\*.*") do ( 
19.
  for /f "delims=" %%f in ('xcopy /ehl /d:%YoungerThan% "%%d\*.*" c:\ ^| find /v "Datei(en) kopiert"') do ( 
20.
    set "ActDirFullPath=%%d" 
21.
    set "ActDirName=%%~nxd" 
22.
    call :ProcessDir 
23.
24.
25.
 
26.
exit /b 
27.
 
28.
 
29.
 
30.
:ProcessDir 
31.
  if "%OldDir%" equ "%ActDirFullPath%" exit /b 
32.
  set "OldDir=%ActDirFullPath%" 
33.
  xcopy /kreischy "%ActDirFullPath%\*.*" "%DestDir%\%ActDirName%" 
34.
exit /b
Den Code z.B. als DeployCopy.cmd speichern. Aufruf mit
DeployCopy "QuellVerzeichnis" "ZielVerzeichnis" TT.MM.YYYY
QuellVerzeichnis enthält Deine Deploy-Verzeichnisse, ZielVerzeichnis ist ja klar und TT.MM.YYYY ist das Datum, also im Format "Tag Punkt Monat Punkt Jahr".

In den Zeilen 9-15 wird das übergebene Datum in seine Bestandteile zerlegt und so neu zusammengestellt, dass es für den XCOPY-Befehl in Zeile 19 verwertbar ist.

Die Zeile 18 liefert alle Verzeichnisse im Quellverzeichnis, in denen der XCOPY-Befehl in Zeile 19 dann nach Dateien sucht, die jünger als das angegebene Datum sind. Wegen dem Parameter /l werden die gefundenen Dateien nur aufgelistet, nicht kopiert.

Wenn Dateien gefunden werden, wird ins Unterprogramm ProcessDir gesprungen. Hier wird das von der äußeren FOR-Schleife im Hauptprogramm aktuell verarbeitete Verzeichnis in eine Variable geschrieben. Nur wenn das beim letzten Aufruf von ProcessDir gemerkte Verzeichnis vom aktuellen verschieden ist, wird mit dem XCOPY-Befehl in Zeile 33 das aktuelle Deploy-Verzeichnis kopiert. So wird verhindert, dass die Kopieraktion eines Deploy-Verzeichnisses mehrmals durchgeführt wird, auch wenn XCOPY aus Zeile 19 mehrere jüngere Dateien findet.

Gruß
Friemler
Bitte warten ..
Mitglied: Vanessa
04.06.2011 um 20:37 Uhr
wow!

Der Trick mit "virtuellen Listen" in der Zeile 19 ist super! Das Umgehen mit lokalen Variablen war auch sehr lehrreich für mich.
Funktioniert genau wie gewünscht! Herzlichen Dank!!

Friemler, Du bist gut. ;)

Gruss
Vanessa
Bitte warten ..
Mitglied: Friemler
05.06.2011 um 03:49 Uhr
Hallo Vanessa,

gern geschehen.

Aber mit "virtuellen Listen" hat das eigentlich nichts zu tun. Ich benutze in Zeile 19 XCOPY nur dazu, um den Aufruf des Unterprogramms ProcessDir zu triggern. Sobald XCOPY etwas ausgibt (Namen von gefundenen Dateien), wird der Rumpf der FOR-Schleife ausgeführt (Zeilen 20 bis 22) und damit das Unterprogramm gestartet. Die Ausgabe von dem Zeile-19-XCOPY wird nicht weiterverarbeitet.

Um Zeit zu sparen und wirklich nur die jüngeren Dateien in ein Verzeichnis mit den Master-Versionen der verschiedenen Deploy-Ordner einzupflegen, könntest Du folgende gekürzte Version verwenden:
01.
@echo off 
02.
 
03.
setlocal 
04.
 
05.
 
06.
set "SrcDir=%~1" 
07.
set "DestDir=%~2" 
08.
 
09.
for /f "eol= tokens=1-3 delims=." %%d in ("%~3") do ( 
10.
  set "Day=%%d" 
11.
  set "Month=%%e" 
12.
  set "Year=%%f" 
13.
14.
 
15.
set "YoungerThan=%Month%-%Day%-%Year%" 
16.
 
17.
 
18.
for /d %%d in ("%SrcDir%\*.*") do ( 
19.
  xcopy /krischy /d:%YoungerThan% "%%d\*.*" "%DestDir%\%%~nxd" 
20.
)
Sollte das Zielverzeichnis auf einer Netzwerkfreigabe liegen, wäre ROBOCOPY für die Aufgabe besser geeignet, da es Sicherheitsmechanismen gegen Netzwerkfehler eingebaut hat.

Gruß
Friemler
Bitte warten ..
Mitglied: Vanessa
05.06.2011 um 16:01 Uhr
Ok, alles klar.

Ich habe mich vielleicht etwas doof ausgedrückt: mit "virtuellen Liste" meinte ich die Ausgabe von xcopy - die Liste von jungeren Dateien. Dann kopiert (wenn nicht bereits geschehen) das Unterprogramm den gesamten (sehr gut!) Inhalt vom aktuellen Deploy-Ordner in den gleichnamigen Zielordner. Was kann man sich da noch mehr wünschen!! ))

Besten Dank noch mal!

Gruss
Vanessa
Bitte warten ..
Neuester Wissensbeitrag
Internet

Unbemerkt - Telekom Netzumschaltung! - BNG - Broadband Network Gateway

(3)

Erfahrungsbericht von ashnod zum Thema Internet ...

Heiß diskutierte Inhalte
Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (15)

Frage von JayyyH zum Thema Switche und Hubs ...

DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...