larz
Goto Top

Alle (Unter-)Unterordner per Batch in darüberliegendes Verzeichnis verschieben

Hallo zusammen,

Ausgangssituation:
ich habe einen PC mit einer Verzeichnisstruktur die für Windows zu lange ist.

Resultat:
Ordner können nicht mehr gelöscht werden, obwohl keine Dateien und voller Zugriffsrechte vorhanden sind.

Bisherige Versuche:
Durch Recherche im Netz habe ich erfahren dass man die Ordner zumindest noch verschieben kann, also vom Unterordner in den Hauptordner (und das über ca. 20 - 25 Ebenen).
Danach ist ein Löschen möglich. Ich wollte nun mit dem Move-Befehl die Verzeichnisse verschieben, aber das scheint ja nur mit Dateien zu funktionieren...
Weiß jemand wie das mit den (Unter-(Unter-(Unter-(usw.))))Unterordnern geht?


Gruß
Larz

Content-Key: 100800

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

Printed on: April 25, 2024 at 14:04 o'clock

Member: bastla
bastla Nov 02, 2008 at 09:25:16 (UTC)
Goto Top
Hallo Larz!

Sollte eigentlich so gehen:
@echo off & setlocal
set "Quelle=D:\Dein\langer\Pfad\zu\den\Unterordnern"  
set "Ziel=D:\KurzerPfad"  

if not exist "%Ziel%" md "%Ziel%"  
for /d %%i in ("%Quelle%\*.*") do if not exist "%Ziel%\%%~nxi" move "%%i" "%Ziel%"  
Ansonsten sollte der Zugriff auf die tiefer liegenden Ordner aber auch klappen, wenn Du den "Weg" mit
subst K: "D:\Dein\langer\Pfad\zu\den\Unterordnern"
verkürzt (anstelle von "K" tut es natürlich jeder freie Laufwerksbuchstabe).

Mit
subst K: /d
gibst Du den Buchstaben "K" wieder frei.

Grüße
bastla

[Edit] Pfadangabe bei "subst" korrigiert. [/Edit]
Member: Larz
Larz Nov 02, 2008 at 09:42:56 (UTC)
Goto Top
Moin Bastla,

danke für die schnelle Antwort. Problem ist nur, dass dein Script die Ordner zwar alle verschiebt, aber in der bestehenden Ordnerstruktur belässt, d.h. wieder zu lange Verzeichnispfade abbildet; d.h. ich kann die leeren Verzeichnisse wieder nicht löschen face-smile

Im Prinzip müsste es so eine Art Schleife sein, die vom untersten Ordner aus alles ins obertse Verzecihnis verschiebt...


Gruß
Larz
Member: bastla
bastla Nov 02, 2008 at 09:51:29 (UTC)
Goto Top
Hallo Larz!
... zwar alle verschiebt, aber in der bestehenden Ordnerstruktur belässt ...
... was ich ja grundsätzlich sinnvoll finde ...

Eigentlich sollte es doch genügen, wenn Du den Großteil des Pfades (durch Angabe als %Quelle%) entfernst (wodurch, in meinem Beispiel oben, aus "D:\Dein\langer\Pfad\zu\den\Unterordnern\EinUnterordner" dann eben "D:\KurzerPfad\EinUnterordner" und damit wieder vernünftig handhabbar wird) - oder verstehe ich da etwas gründlich falsch?

Grüße
bastla
Mitglied: 60730
60730 Nov 02, 2008 at 09:52:32 (UTC)
Goto Top
Moinsen larz,

an deiner Stelle würde ich den 2. Ansatz von Bastla weiterverfolgen.

Woher soll das Script "wissen" welcher Ordner gerade noch zu erkennen ist - aber dann nicht mehr zu verschieben ist, weil der Pfad zu lange ist...

"Normalerweise" hat so eine Unterunterunter struktur ja auch irgendeinen Sinn - da würde ich lieber selbst Hand anlegen, als eine Batch zu bemühen.

Gruß
Member: bastla
bastla Nov 02, 2008 at 09:57:07 (UTC)
Goto Top
@timobeil
Sehe ich zwar grundsätzlich ebenfalls so, aber mit "subst" musst Du ja auch auf einer bestimmten Ebene ansetzen - dann kannst Du diese Ebene aber auch gleich als Quellpfad für den Batch verwenden ...

Grüße
bastla
Mitglied: 60730
60730 Nov 02, 2008 at 10:02:47 (UTC)
Goto Top
@ Bastla
eh klar face-wink

ich würde - nachdem ich mr die frage nochmal angesehen habe - eher zu folgender (ungetester Lösung) tendieren:
subst K: "D:\Dein\langer\Pfad\zu\den\Unterordnern"  
FOR /F "delims=" %%i in ('dir /b /s /ad k:') do rd "%%i" 2>NUL  

Er will ja eigentlich nicht moven, sondern nur die leeren löschen.
Und dann "schön" manuell eine neue Ordnung - oder mittels Batch schaffen.

PS: Ich hatte noch keinen Kaffe face-wink - möglich das der Ansatz voll daneben ist.
Member: Larz
Larz Nov 02, 2008 at 10:50:12 (UTC)
Goto Top
Hallo zusammen,

danke für eure Beiträge soweit. Es ist tatsächlich wie TimoBeil sagt - ich will die gesamte Struktur eigentlich "nur" löschen. Aufgrund der Unterunterunter-Ordner geht das aber nicht. D.h. alle Unterordner sollten einfach mal in den Root-Ordner verschoben werden, dann kann man die 34567 oder was weiß ich wie viele Ordner flach löschen.

@timobeil: Das hat so nicht geklappt, innerhalb der Batch sagt er immer wieder "Verzeichnisname zu lang" - wolltest Du damit direkt löschen? "delims" sagt mir leider nichts...

Gruß
Larz
Member: bastla
bastla Nov 02, 2008 at 11:03:16 (UTC)
Goto Top
Hallo Larz!

Wenn der Pfad noch immer zu lang ist, dann vielleicht besser so:
subst K: "D:\Dein\langer\Pfad\zu\den\Unterordnern"  
FOR /D %%i in (k:\*.*) do rd /s /q "%%i" 2>NUL  
Damit wird nur die in der ersten Zeile angegebene Ebene abgearbeitet, wobei die Unter-Unterordner gleich mit gelöscht werden.

Sollte das noch immer nicht klappen, musst Du eben den Pfad in Zeile 1 noch tiefer ansetzen.

Grüße
bastla
Member: miniversum
miniversum Nov 02, 2008 at 11:21:01 (UTC)
Goto Top
Ich hätte da noch 2 Ideen für einen ganz anderen Ansatz. Ist aber nur so ein Tip ins blaue hinein. Aber so hat das bei mir schonmal innem ähnlcihen Fall funktioniert:
Lösche einfach ganz normal den ordner, verwende dazu allerdings die Kurzen Verzeichnisnamen.

Die andere idee wäre einfach nur den obersten Ordner (also der indem die unterordner liegen). Also:
 rd /s C:\Ab_Hier_viele_Unterordner
Member: Larz
Larz Nov 02, 2008 at 17:15:16 (UTC)
Goto Top
Hey Bastla,

die Lösung bringt's, danke! Endlich sind diese lästigen Verzeichnisse weg....
Könntest Du mir kurz erläutern, was die zweite Zeile so macht? Z.B. %%i und 2>NUL ?
Schließlich will ich verstehen, nicht nur kopieren... face-wink

Danke nochmal

Gruß
Larz
Member: bastla
bastla Nov 02, 2008 at 17:28:53 (UTC)
Goto Top
Hallo Larz!
Könntest Du mir kurz erläutern, was die zweite Zeile so macht?
Grundsätzlich findest Du zu allen verwendeten Befehlen Hilfestellung durch Eingabe von "Befehl /?", also etwa "for /?" in der Kommandozeile ...

FOR /D %%i in (k:\*.*) do
Gehe alle Ordner ("directories") in "K:\" (Name egal) durch und speichere den Ordnerpfad in "%%i"
rd /s /q "%%i"
Lösche den durch "%%i" angegebenen Ordner samt Unterordnern ("subdirectories"), und das ohne lästige Fragen ("quiet")
2>NUL
Schicke ev auftretende Fehlermeldungen (Fehlerkanal = 2) nach "Nirgendwo" ("NUL") und verhindere damit eine Bildschirmanzeige selbiger - wäre hier (bei einer einmaligen Aktion) eigentlich nicht nötig gewesen (sieht aber, vor allem bei regelmäßig verwendeten - und schon gut getesteten - Batches, eleganter aus face-wink)

Grüße
bastla
Mitglied: 65883
65883 Mar 11, 2011 at 13:11:22 (UTC)
Goto Top
Hallo,

ich habe (oder besser ich hatte) hier 5000 RAR-Archive.

(log0001.rar , log0002.rar , ...)

Beim Entpacken wurde für jede RAR-Datei ein Verz. erstellt. Soweit ok.

Nun war der Inhalt selbst in einem Verzeichnis mit gepackt.
NACH dem entpacken und Löschen der RAR-Dateien hab ich jedoch leider pro Verzeichnis ein Verzeichnistiefe zu viel:

Ursprung:

log0001.rar


entpackt:

log0001/log0001/dat001.log
log0001/log0001/dat002.log
log0001/log0001/dat003.log
usw.


So sollte es ausschauen:

log0001/dat001.log
log0001/dat002.log
log0001/dat003.log
usw.

Wie bekomme ich in jedem der 5000 Verzeichnisse jeweils eines Verzeichnis gelöscht?

Kann ich die Lösung von bastla 1:1 übernehme?

subst K: "D:\Dein\langer\Pfad\zu\den\Unterordnern"  
FOR /D %%i in (k:\*.*) do rd /s /q "%%i" 2>NUL  

Gruß ... tc
Member: bastla
bastla Mar 11, 2011 at 15:27:18 (UTC)
Goto Top
Hallo truecolor!

Ist eigentlich eine andere Fragestellung ...

Ausgehend von einem "Überordner" (im Beispiel "D:\Entpackt", daher gäbe es also "D:\Entpackt\og0001\log0001\dat001.log" usw) könnte das so gehen:
@echo off & setlocal
pushd "D:\Entpackt"  
for /f "delims=" %%i in ('dir /b /ad') do if exist "%%i\%%i\" (  
    echo move "%%i\%%i\*.*" "%%i"  
    echo rd "%%i\%%i"  
)
popd
pause
Die "echo"-Befehle vor "move" und "rd" sollen ein gefahrloses Testen ermöglichen - solange die da stehen, werden die Verschiebe- und Löschbefehle nur angezeigt, aber nicht ausgeführt ...

Grüße
bastla

[Edit] Auf "for /f" umgestellt [/Edit]