6741
Goto Top

automatisch den Inhalt von Ordner verschiebem bzw kopieren

Hallo,

ich habe einen Ordner ( Ordner1 ) mit ca. 200 Unterordnern. In jeden Unterordner befinden sich ein weitere Ordner mit ca. 50 - 200 Dateien. Jetzt möchte ich den 2. Unterordner eine Ebene höher verschoben bekommen. So das der erste Unterordner gelöscht wird und der zweite Unterordner eine Stufe höher rückt ...

hoffe mir kann einer eine nette Batch schreiben .....

schönes WE

Content-Key: 53703

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

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

Member: bastla
bastla Mar 09, 2007 at 19:36:53 (UTC)
Goto Top
Hallo firewalldevil!

Wie immer bei derartigen Aktionen stellt sich eine wichtige Frage: Sind Kollisionen von Unter-Unterordnernamen zu erwarten, und wie ist damit umzugehen?

Zur Erläuterung folgende beispielhafte Struktur:
Ordner1
    Unterordner1
        Test1
        Test3
        Test4
            Datei1.txt
            Datei3.txt
    Unterordner2
        Test2
        Test4
            Datei2.txt
            Datei3.txt
Wenn nach Deinem Wunsch alle Test-Ordner zu Unterordnern von Ordner1 werden sollen, was soll mit Test4 aus Unterordner2 passieren?

Man könnte natürlich einfach alle enthaltenen Dateien in den dann schon existierenden Ordner Ordner1\Test4 (der aus Unterordner1 nach oben verschoben wurde) verschieben - nur würde sich dann die nächste Frage stellen: Was tun mit den beiden gleichnamigen Datei3.txt?

Wenn Du natürlich ausschließen kannst, dass es gleichnamige Unter-Unterordner geben kann, sind gleichnamige Dateien kein Problem ...
Noch eine andere Frage: Sind auch noch Unter-Unter-Unterordner zu berücksichtigen?

Grüße
bastla
Mitglied: 6741
6741 Mar 09, 2007 at 21:21:12 (UTC)
Goto Top
Hi bastla,

es gibt in dem ersten Ordner immer nur einen eindeutigen ordner, alles was im nächsten unterordner ist, soll eine Stufe höcher und der 2. unterordner kann gelöscht werden. Müsste wohl Ordner für Ordner druchgehen, da ich nicht weiß ob es dateien gibt die in der letzten ebene glecie sind. Wenn es baer Ordner für Ordner abgearbeitet wird, sollte nicht passieren.

gruß
Member: Biber
Biber Mar 10, 2007 at 11:53:51 (UTC)
Goto Top
Hmmm, fwd,

ich bin nicht ganz sicher, ob ich die ganze Aktion richtig verstehe... ich frag lieber noch mal nach...

Ich habe eine Beispielstruktur angelegt, die ich mit zwei FOR /D-Anweisungen durchgehen könnte.
$cmd$dir /b /s Root
Z:\>
$cmd$dir /b /s root
Z:\root\einsA
Z:\root\einsb
Z:\root\einsc
Z:\root\einsd
Z:\root\einsA\zweiAA
Z:\root\einsA\zweiBB
Z:\root\einsA\zweiCC
Z:\root\einsA\zweiDD
Z:\root\einsA\blaeinsA.txt
Z:\root\einsb\zweiNN
Z:\root\einsb\zweiMM
Z:\root\einsb\zweiOO
Z:\root\einsb\blaeinsb.txt
Z:\root\einsb\zweiOO\drei333
Z:\root\einsb\zweiOO\drei334
Z:\root\einsb\zweiOO\drei335
Z:\root\einsb\zweiOO\drei335\vier444
Z:\root\einsb\zweiOO\drei335\vier445
Z:\root\einsb\zweiOO\drei335\vier446
Z:\root\einsc\blaeinsc.txt
Z:\root\einsd\zweiXX
Z:\root\einsd\zweiYY
Z:\root\einsd\zweiZZ
Z:\root\einsd\zweiFF
Z:\root\einsd\zweiGG
Z:\root\einsd\zweiHH
Z:\root\einsd\blaeinsd.txt
Die Zählvariablen nenne ich %e für die erste, %z für die zweite Ebene.
---- einmal Simulation mit "ECHO"  
$cmd$for /D %e in (\Root\*.*) do @(for /d %z in (%e\*.*) do @echo move "%z" "%~dpe") && echo rd "%e"  
move "\Root\einsA\zweiAA" "Z:\Root\"  
move "\Root\einsA\zweiBB" "Z:\Root\"  
move "\Root\einsA\zweiCC" "Z:\Root\"  
move "\Root\einsA\zweiDD" "Z:\Root\"  
rd "\Root\einsA"  
move "\Root\einsb\zweiNN" "Z:\Root\"  
move "\Root\einsb\zweiMM" "Z:\Root\"  
move "\Root\einsb\zweiOO" "Z:\Root\"  
rd "\Root\einsb"  
move "\Root\einsd\zweiXX" "Z:\Root\"  
move "\Root\einsd\zweiYY" "Z:\Root\"  
move "\Root\einsd\zweiZZ" "Z:\Root\"  
move "\Root\einsd\zweiFF" "Z:\Root\"  
move "\Root\einsd\zweiGG" "Z:\Root\"  
move "\Root\einsd\zweiHH" "Z:\Root\"  
rd "\Root\einsd"  
Jetzt etwas ernsthafter:
$cmd$for /D %e in (\Root\*.*) do @(for /d %z in (%e\*.*) do @move "%z" "%~dpe">nul) &&  rd "%e" 2>nul  
$cmd$for /D %e in (\Root\*.*) do @(for /d %z in (%e\*.*) do @move "%z" "%~dpe">nul) &&  rd "%e" 2>nul  

$cmd$dir /s /b root
Z:\root\einsA
Z:\root\einsb
Z:\root\einsc
Z:\root\einsd
Z:\root\zweiHH
Z:\root\zweiAA
Z:\root\zweiBB
Z:\root\zweiCC
Z:\root\zweiDD
Z:\root\zweiNN
Z:\root\zweiMM
Z:\root\zweiXX
Z:\root\zweiYY
Z:\root\zweiZZ
Z:\root\zweiFF
Z:\root\zweiGG
Z:\root\drei333
Z:\root\drei334
Z:\root\vier444
Z:\root\vier445
Z:\root\vier446
Z:\root\einsA\blaeinsA.txt
Z:\root\einsb\blaeinsb.txt
Z:\root\einsc\blaeinsc.txt
Z:\root\einsd\blaeinsd.txt

Ergebnis:
- die Ordner der Unterebenen sind in die neue Ebene "Root" verschoben worden.
- aber die Verzeichnisse einsA, einsB, einsC und einsD konnten nicht gelöscht werden, da dort noch Dateien liegen (blaeinsA.txt etc).

Was sollte denn mit solchen Dateien passieren, falls vorhanden? Wo gehören die denn hin?

Gruss
Biber
Mitglied: 6741
6741 Mar 10, 2007 at 12:38:47 (UTC)
Goto Top
Hi Biber ...

danke das du dich der Aufgabe stellst .... ;>)

\\daten\ordner1\ordner2\*.txt
.
.
. bis ca. 200 x
.
.
\\daten\ordner1\ordner2\*.txt

Ordner2 soll auf die Höhe von Ordner1 verschoben werden , dann kann Ordner1 ( alt ) gelöscht werden.

die Ordner 1 u. 2 haben keine Ordnung bzw sind mit Buchstaben, Zahlen und erlaubt Sonderzeichen verstehen. Es gibt keine erkennbar Struktur in der Benennung.

Können also hießen z.b. [asdee]_001 oder auch asdd-zzu09, das glaube ich ist das Problem ...

gruß in WE
Member: Biber
Biber Mar 10, 2007 at 12:50:42 (UTC)
Goto Top
Moin fwd,

dann sollte das doppelte FOR/D-Schleifchen oben ja passen.
Du musst nur statt ...(\Root\*.*)... in meinem Beispiel bei dir schreiben: ....(\\daten\ordner?)...

Probier es doch mal vom CMD-Prompt mit der Simulations-Variante (die mit den "Echo"s).
for /D %e in (\\Daten\Ordner*.*) do @(for /d %z in (%e\*.*) do @echo move "%z" "%~dpe") && echo rd "%e"
Wie sieht denn dann das Ergebnis aus?

Gruss
Biber
Mitglied: 6741
6741 Mar 15, 2007 at 16:52:59 (UTC)
Goto Top
hi biber ...

es tut sich nichts ... mmhhh ...

der Ordner heißt jetzt ...

d:\daten1\daten2\ordner1\ordner2\

also von ordner2 nach ordner 1 soll gehen ...
Member: Biber
Biber Mar 15, 2007 at 18:02:44 (UTC)
Goto Top
Moin, fwd,

dann reden wir noch ein ganz klein bissi aneinander vorbei.

Meine Zeile tut folgendes:
(=18:56:10  F:\=)
><b>dir d:\daten1 /b /s</b>
d:\daten1\daten2
d:\daten1\daten2\ordner1
d:\daten1\daten2\ordner1\ordner2
(=18:56:20  F:\=)
><b>for /D %e in (d:\Daten1\*) do @(for /d %z in (%e\*.*) do @move "%z" "%~dpe") && rd "%e"</b>  

(=18:56:32  F:\=)
><b>dir d:\daten1 /b /s</b>
d:\daten1\ordner1
d:\daten1\ordner1\ordner2

Bitte mal mal das auf, was bei Dir bei dem "dir d:\daten1 /b /s" herauskommen soll.

Offensichtlich habe ich die Unter/Verschiebe-Ebenen anders verstanden als Du gemeint hattest.

Gruss
Biber
Mitglied: 6741
6741 Mar 15, 2007 at 18:31:36 (UTC)
Goto Top
wie du es postetes siehts gut aus, aber ich möchte ordner2 auf die Höhe von Ordner 1 verschoben haben. Daten1 und Daten2 sind eindeutige Namen.

gruß
Member: Biber
Biber Mar 15, 2007 at 18:53:39 (UTC)
Goto Top
Na dann ist doch noch viel weniger Aufwand...
>md d:\daten1\daten2\ordner1\ordner2
>for /D %e in (d:\Daten1\daten2\*) do @(for /d %z in (%e\*.) do @move "%z" "%~dpe")  

(=19:52:04  F:\=)
>dir d:\daten1 /b /s
d:\daten1\daten2
d:\daten1\daten2\ordner1
d:\daten1\daten2\ordner2

Gruss
Biber
Mitglied: 6741
6741 Mar 16, 2007 at 17:37:58 (UTC)
Goto Top
hi biber,

die dos box sagt, system kann die angegebene datei nicht finden ...

also ordner1 kann 100 unterschiedliche namen haben und ordner 2 auch .. es gibt keinen zusammenhang ..

gruß ins we
Member: Biber
Biber Mar 16, 2007 at 17:48:43 (UTC)
Goto Top
Na fwd,

das muss ich auch erstmal überschlafen - oder mal andere ranlassen.
Ich mach jetzt auch erstmal Wochenende,

Gruss
Biber
Member: bastla
bastla Mar 16, 2007 at 22:58:56 (UTC)
Goto Top
Hallo firewalldevil!

Nur so eine Frage: Sagt die "DOS-Box" vielleicht auch, dass die Ordner trotz der irritierenden Meldungen verschoben wurden?

Wie auch immer, versuch es vielleicht damit:
@echo off
for /f "delims=" %%e in ('dir "%~1" /b /ad') do (  
	for /f "delims=" %%z in ('dir /b /ad "%~1\%%e"') do move "%~1\%%e\%%z" "%~1"   
	rd "%~1\%%e" 2>nul  
)
Aufruf (wenn als "C:\Scripts\LiftFolders.bat") gespeichert:
C:\Scripts\LiftFolders.bat "D:\Daten1\Daten2"  
@Biber
Nach meinen Versuchen mit dem Schalter "/D" scheint es so, als würden die nach oben verschobenen Ordner ein weiteres Mal behandelt (seltsam genug), wobei dies, wenn der Name dieser Ordner Leerzeichen enthält, für jeden Namensbestandteil einzeln versucht wird - also Verschieben klappt, aber danach die ganzen Fehlermeldungen "Das System kann die angegebene Datei nicht finden." ...

Schönes WE
bastla
Mitglied: 6741
6741 Mar 18, 2007 at 19:01:13 (UTC)
Goto Top
hi bastla ...

das Script liegt auf c:\scritps und die Ordner auf d:\daten ...

ich erkenne nicht den Zusammenhang das das Script d:\ ansteuert ... kannst du mir bitte das Script erklären ...

Gruß und Danke
Member: bastla
bastla Mar 18, 2007 at 19:13:10 (UTC)
Goto Top
Hallo firewalldevil!

Das Script ist etwas allgemeiner gehalten und erwartet den zu bearbeitenden Ordner als Argument beim Aufruf - also musst Du es, wie oben beschrieben, starten mit:
C:\Scripts\LiftFolders.bat <b>"D:\Daten1\Daten2"</b>  
Um es gegen einen Aufruf ohne Argument abzusichern, könntest Du noch folgende Zeile nach "@echo off" einfügen:
if [%1]== echo Bitte Startordner beim Aufruf angeben! & goto :eof

Grüße
bastla
Member: bastla
bastla Mar 18, 2007 at 19:53:13 (UTC)
Goto Top
Hallo firewalldevil!

Vielleicht ist es Dir so sympathischer:
@echo off
set "Ordner=D:\Daten1\Daten2"  
for /f "delims=" %%e in ('dir "%Ordner%" /b /ad') do (  
    for /f "delims=" %%z in ('dir /b /ad "%Ordner%\%%e"') do move "%Ordner%\%%e\%%z" "%Ordner%"   
    rd "%Ordner%\%%e" 2>nul  
)
Jetzt kannst Du wieder durch einfachen Aufruf der Batch-Datei starten.

Grüße
bastla