jamesbond8811
Goto Top

Dateien aus Unterverzeichnissen verschieben

Trotz einiger gefundener Hinweise komme ich nicht klar

Hallo zusammen,

ich habe ein übergeordnetes Verzeichnis A, in dem sich untergeordnete Verzeichnisse B bis Z befinden. In jedem der untergeordneten Verzeichnisse befinden sich eine oder mehrere Dateien.

Ich möchte eine Batch-Datei erstellen, mit deren Hilfe ich alle Dateien aus den Unterverzeichnissen B bis Z in das übergeordnete Verzeichnis A verschieben kann. Idealerweise sollen die Unterverzeichnisse anschließend gelöscht werden.

Habe versucht, eine Batch-Datei zu erstellen, wie es hier von Biber beschrieben ist:
Per Batch dateien aus Unterordner in den Hauptordner verschieben

Wenn ich dann die Datei ausführe, kriege ich die Fehlermeldung "Das System kann den angegebenen Pfad nicht finden". Wahrscheinlich ist der Dateiname von mir nicht korrekt angegeben worden (etwas mit der Syntax?).

Wäre froh, wenn jemand mir als einem blutigem Anfänger den Vorgang Schritt für Schritt erklären könnte.

P.S. Spielt es eine Rolle, wenn Dateinamen Leerzeichen haben?

Content-Key: 62736

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

Ausgedruckt am: 29.03.2024 um 14:03 Uhr

Mitglied: Tire
Tire 30.06.2007 um 20:55:17 Uhr
Goto Top
hi,
also so wie ich das hier vestehe, kanst du auch einfach im überordner A alle anderen ordner auswählen(<strg>+<a>) und dann im gewünschten verzeichnis einfach wieder einfügen!
oder nicht?

mfg
tire
ps. ja es spiel oft ein rolle, wenn dateinamen ein leerzeichen haben!
Mitglied: JamesBond8811
JamesBond8811 30.06.2007 um 22:47:45 Uhr
Goto Top
hi,
also so wie ich das hier vestehe, kanst du
auch einfach im überordner A alle
anderen ordner
auswählen(<strg>+<a>) und
dann im gewünschten verzeichnis einfach
wieder einfügen!
oder nicht?

mfg
tire

Hallo, nein, leider nicht. face-smile
Ich möchte ja nicht Unterordner verschieben, sondern Dateien, die darin enthalten sind. Unterordner selbst sollen anschließend gelöscht werden.
Mitglied: bastla
bastla 01.07.2007 um 09:31:18 Uhr
Goto Top
Hallo JamesBond8811 und willkommen im Forum!

Deine Aufgabe ist aber trotzdem über den Explorer zu lösen, indem Du vom Ordner A aus eine "Suche" nach allen Dateien (also ohne etwa Teile des Dateinamens oder -inhaltes anzugeben ) durchführst, das Ergebnis nach der Spalte "Im Ordner" sortierst, die in den Unterordnern gefundenen Dateien markierst, ausschneidest und in den Ordner A einfügst. Das Löschen der Unterordner müsste dann gleichfalls "von Hand" erfolgen.
Da Du aber nach einer Batch-Lösung gefragt hast, ein Vorschlag, den Du unmittelbar an der Kommandozeile verwenden kannst:
for /d %i in ("D:\A\*.*") do @move /-y "%i\*.*" "D:\A" & @dir /s /a-d "%i">nul 2>nul || rd /s /q "%i"  
Das D:\A entspricht Deinem angegebenen Beispielsverzeichnis A und muss natürlich entsprechend geändert werden. Falls Du die Zeile nicht am Prompt, sondern tatsächlich als Batch verwenden willst, ist jedes %i durch ein %%i zu ersetzen.

Vorweg eine Warnung: Diese Zeile wird Dateien verschieben und Verzeichnisse löschen, also zuerst auf Testdaten oder eine Kopie anwenden!

Zwei Anmerkungen:

Wie immer beim Verschieben/Kopieren von Dateien musst Du vorweg überlegen, was passieren soll, wenn eine Datei gleichen Namens bereits im Zielverzeichnis vorhanden ist. Der "move"-Befehl (zum Verschieben) fragt Dich in diesem Fall (aus Sicherheitsgründen verwende ich den Schalter "/-y") jeweils, ob einmal (diese Datei), diesmal nicht oder immer (bei diesem "move", also für dieses Verzeichnis) überschrieben werden soll.

Es werden auch wunschgemäß die "leeren" Verzeichnisse gelöscht, wobei ich "leer" so definiere, dass weder das Verzeichnis selbst, noch eines seiner Unterverzeichnisse (falls überhaupt vorhanden) noch eine Datei enthält - dann wird allerdings ohne Rückfrage das Verzeichnis inklusive aller Unterverzeichnisse entfernt.

Informationen zu den verwendeten Befehlen erhältst Du, indem Du zB "for /?" oder "help for" eingibst.

Erklärungsbedürftig könnte der zweite Teil der Zeile (nach dem "&", mit dem man mehrere Befehle verknüpfen kann) sein:
Um festzustellen, ob ein Verzeichnis oder dessen Unterverzeichnisse Dateien enthalten, wird der "dir"-Befehl mit den Schaltern "/s" (durchsuche auch Unterverzeichnisse) und "/a-d" (berücksichtige dabei aber nur Dateien) verwendet.

Da nur das Gesamtergebnis interessiert, wird die Ausgabe der gefundenen Dateien (mit ">nul") und die Fehlermeldung, wenn ein Verzeichnis keine Dateien enthält (mit "2>nul") ins "Nichts" umgeleitet.

Falls tatsächlich keine Dateien gefunden wurden, wird der "dir"-Befehl selbst mit einem Fehlercode ("Errorlevel") von 1 beendet.



Abschließend noch zu Deiner Frage nach den Leerstellen in Dateinamen: Das Leerzeichen wird als Trennzeichen interpretiert und würde einen Datei- (und natürlich auch Verzeichnis-) Namen "zerschneiden". Um das zu verhindern, müssen solche Namen (oder ganze Pfade, in denen zumindest eine Leerstelle enthalten ist) in Anführungszeichen eingeschlossen werden. Bei dem oben als Beispiel verwendeten Verzeichnis "D:\A" wäre dies zwar nicht erforderlich, da es aber auch nicht schadet, setze ich die Anführungszeichen mittlerweile schon gewohnheitsmäßig.

Grüße
bastla
Mitglied: JamesBond8811
JamesBond8811 01.07.2007 um 15:26:01 Uhr
Goto Top
Hallo bastla,

vielen Dank für die ausführliche Anleitung!

Der Tipp mit dem Windows-Explorer ist in der Tat sehr gut. Jedoch hat manchmal Dateien, die ganz unterschiedliche Namen und Erweiterungen haben, so dass mir dann eine Batch-Lösung besser erscheint.

Werde sie ausprobieren und von meinen Ergebnissen berichten.

Grüße
JamesBond8811
Mitglied: Biber
Biber 10.07.2007 um 21:00:07 Uhr
Goto Top
Moin JamesBond8811,
> Werde sie ausprobieren und von meinen Ergebnissen berichten.

Nachfrage: Gibt es denn schon erste Zwischenergebnisse?

Grüße
Biber
Mitglied: JamesBond8811
JamesBond8811 11.07.2007 um 16:23:09 Uhr
Goto Top
Moin JamesBond8811,
> Werde sie ausprobieren und von meinen
Ergebnissen berichten.

Nachfrage: Gibt es denn schon erste
Zwischenergebnisse?

Grüße
Biber

Hallo Biber,

den konkreten Fall konnte ich mit Hilfe von Windows-Explorer lösen, da alle Dateien die gleiche Endung hatten.

Ich habe aber auch die Eingabe über die Kommandozeile versucht, doch es will nicht so richtig klappen. Wahrscheinlich liegt es daran, dass ich von der Sache nur ganz wenig Ahnung habe.

Also, ich habe folgendes gemacht:

1) cmd.exe aufgerufen.
Da erscheint: C:\WINDOWS\system32>

2) ich kopiere


(Verzeichnisse entsprechend angepasst) in die Zwischenablage und füge es über STR. + V in die Kommandozeile ein. Drücke auf Enter. Kommandozeile verschwindet, doch es passiert nichts.

Was mache ich falsch?
Mitglied: Biber
Biber 25.07.2007 um 20:21:25 Uhr
Goto Top
Ganz, ganz sorry, JamesBond8811,

ich hatte Deine Antwort erst eben gelesen.

Kann auch nicht mal sofort sagen, was bei Dir der Klemmer ist.

Ich habe eben noch mal folgenden Proof-of-Concept gemacht:
[Bei mir am CMD-Prompt im Verzeichnis D:\temp, sollte aber auch in "D:\A" fliegen]
(=20:17:46 D:\temp=)
>echo ttt>d:\temp\zwei\test.ttt
[in einem Unterverzeichnis meiner Arbeitsebene eine Datei mit der Endung "*.ttt" anlegen.]
> for /d %i in ("D:\temp\*") do @if exist "%i\*.ttt" echo move /-y "%i\*.ttt" d:\temp
move "D:\temp\zwei\*.ttt" d:\temp
[Simulation des MOVEns]
(=20:18:02 D:\temp=)
> for /d %i in ("D:\temp\*") do @if exist "%i\*.ttt" move /-y "%i\*.ttt" d:\temp
Syntaxfehler.

(=20:18:22 D:\temp=)
> for /d %i in ("D:\temp\*") do @if exist "%i\*.ttt" move /y "%i\*.ttt" d:\temp
D:\temp\zwei\test.ttt


Wie Du siehst, war der doppelt gemoppelte Move-Schalter "/-y" das Problem.
Ein einfaches "/y" bringt eine um vielfaches effizientere Variante.

Grüße
Biber
Mitglied: bastla
bastla 25.07.2007 um 20:46:48 Uhr
Goto Top
@Biber

Das "move /-y" hatte ja ich verbrochen, allerdings aus gutem Grund:

Beim Testen vom Prompt wurde bei "move" ohne "/y", wie zu erwarten, nach dem Überschreiben vorhandener Dateien gefragt, bei Verwendung in einem Batch allerdings nicht - daher zur Vorsicht die explizite Formulierung "/-y", die bei mir auch funktioniert - sowohl im Batch als auch von der Kommandozeile.

Den Syntaxfehler aus Deinem Beispiel erhalte ich übrigens auch nicht:
<D:\temp>echo ttt>d:\temp\zwei\test.ttt

<D:\temp>for /d %i in ("D:\temp\*") do @if exist "%i\*.ttt" echo move /-y "%i\*.ttt" d:\temp  
move /-y "D:\temp\zwei\*.ttt" d:\temp  

<D:\temp>for /d %i in ("D:\temp\*") do @if exist "%i\*.ttt" move /-y "%i\*.ttt" d:\temp  
D:\temp\zwei\test.ttt

<D:\temp>dir /s /b
D:\temp\test.ttt
D:\temp\zwei

Grüße
bastla

P.S.: Dateiversion der cmd.exe: 5.1.2600.2180 (xpsp_sp2_rtm.040803-2158)
Mitglied: Biber
Biber 25.07.2007 um 21:19:06 Uhr
Goto Top
@bastla
Das ist in der Tat skurril...bei "nochm-Test" folgendes Verhalten:
>(=21:12:49 D:\temp=)
> for /d %i in ("D:\temp\*") do @if exist "%i\*.ttt" move /-y "%i\*.ttt" d:\temp

d:\temp\test.ttt überschreiben? (Ja/Nein/Alle):

Also "/-y" als doppelte Negation interpretiert????
 >filever /v %comspec%
--a-- W32i   APP DEU   5.1.2600.2180 shp    401,408 08-04-2004 cmd.exe
        Language        0x0407 (Deutsch (Deutschland))
        CharSet         0x04b0 Unicode
        OleSelfRegister Disabled
        CompanyName     Microsoft Corporation
        FileDescription Windows-Befehlsprozessor
        InternalName    cmd
        OriginalFilenam Cmd.Exe
        ProductName     Betriebssystem Microsoft« Windows«
        ProductVersion  5.1.2600.2180
        FileVersion     5.1.2600.2180 (xpsp_sp2_rtm.040803-2158)
        LegalCopyright  ® Microsoft Corporation. Alle Rechte vorbehalten.

        VS_FIXEDFILEINFO:
        Signature:      feef04bd
        Struc Ver:      00010000
        FileVer:        00050001:0a280884 (5.1:2600.2180)
        ProdVer:        00050001:0a280884 (5.1:2600.2180)
        FlagMask:       0000003f
        Flags:          00000000
        OS:             00040004 NT Win32
        FileType:       00000001 App
        SubType:        00000000
        FileDate:       00000000:00000000

Drex-Windows...*gg

Grüße
Biber
Mitglied: bastla
bastla 25.07.2007 um 21:36:37 Uhr
Goto Top
@Biber

Also "/-y" als doppelte Negation interpretiert????
Eigentlich nur verneinte Bejahung (also: "auf keinen Fall ohne Rückfrage überschreiben") ...

Aber das viel seltsamere ist das Verhalten in Batch - früher hatte ich das offensichtlich nie so genau getestet (bzw ohnehin "/y" verwendet), daher war ich über das kommentarlose Überschreiben auch ohne "/y" entsprechend erstaunt und habe dann zur "Sicherheitsvariante" gegriffen ...

Grüße
bastla
Mitglied: Biber
Biber 25.07.2007 um 21:45:40 Uhr
Goto Top
Ach sooooooo, bastla,

dann wird es eine gesetzte Umgebungsvariable COPYCMD bei Dir sein. Obwohl....?*grübel*

Es steht orakelhaft in COPY /? bzw. auch MOVE /?.

Die Option /Y ist in der COPYCMD-Umgebungsvariablen eventuell voreingestellt.
Dies kann durch die Option /-Y außer Kraft gesetzt werden. Standardmäßig
müssen Sie das Überschreiben von Dateien bestätigen, es sei denn der MOVE-
Befehl wird von einem Batchprogramm aus aufgerufen.


Die ist so grottig implementiert (wie auch %DIRCMD% btw), dass ich dazu mal fast ein Mini-Tut geschrieben hätte.

Spiel mal mit gesetzten %DIRCMD% und DIR-Parametern ein bisschen am Prompt herum, dann siehst Du, was ich meine... face-wink


Grüße
Biber
Mitglied: bastla
bastla 25.07.2007 um 22:01:34 Uhr
Goto Top
@Biber

Gar nicht nötig:
Standardmäßig müssen Sie das Überschreiben von Dateien bestätigen, es sei denn der MOVE-
Befehl wird von einem Batchprogramm aus aufgerufen.


Hätte ich jemals so weit gelesen, wäre mein Staunen unnötig gewesen - genau dieses Verhalten habe ich allerdings mit "/-y" auf "unbedingt vor dem Überschreiben nachfragen" abgeändert (insofern, um Dich zu zitieren, works as designed).

Konsequenz daraus: Bei der nächsten einschlägigen Batchdatei wieder 2 Zeichen eingespart ... face-wink
Da wäre dann eigentlich nur noch das Problem von JamesBond8811 ... face-sad

Vielleicht geht es ja wirklich ohne den Schalter besser, also (von der Kommandozeile):
for /d %i in ("D:\A\*.*") do move "%i\*.*" "D:\A\" & @dir /s /a-d "%i">nul 2>nul || rd /s /q "%i"  
Obwohl - so recht daran glauben kann ich eigentlich nicht ...

@JamesBond8811: Ich habe zum Testen das "@" vor dem "move" entfernt, damit die "move"-Befehle angezeigt werden - so kannst Du besser erkennen was abläuft (bzw wenn sich nix tut).

Grüße
bastla

P.S.: In solchen Situationen bedauere ich die fehlende Gelenkigkeit, um mir in den A.... beißen zu können.