Dateien eine VerzeichnisEbene höher verschieben

  • Hallo!
    Ich habe folgendes Problem, ich habe hier etwa 100 Verzeichnisse und jeder einzelner davon hat noch einen Unterordner und in diesen Unterordner liegen ca. weiter 50 Dateien. Jetzt möchte ich aber diese einzelne Dateien eine Verzeichnis Ebene höher verschieben, damit die Unterordner wegfallen (werden gelöscht).
    Kenn jemand von euch dafür einen passenden Befehl in der CMD oder ein Tool das so etwas erledigen kann (per Hand ist sehr umständlich)?


    mit der For-Schleife FOR /F %%i IN ('dir *.mp3 /S /B') erhalte ich ja einen kompletten Pfad zu jeder einzelnen Datei, z.B. "C:\Musik\Verzeichnis_001\Unterordner\musik.mp3", wie kann ich erreichen das der "Unterordner" weg fallen tut und ich z.B. so etwas erhalte "C:\Musik\Verzeichnis_001\musik.mp3", damit ich einfach dann mit dem Befehl move die Dateien verschieben kann.

    MfG Dephender

  • weshalb musst du denn die Dateien verschieben ? kopiere sie doch einfach
    copy C:\Musik\Verzeichnis_001\Unterordner\*.* C:\Musik\Verzeichnis_001\
    copy C:\Musik\Verzeichnis_002\Unterordner\*.* C:\Musik\Verzeichnis_002\
    wie der genaue Befehl aussieht kann ich gerade nicht sagen
    und das ganze in eine Bat-Datei verpacken
    du kannst dann alle Aktionen untereinander schreiben

  • katjarella
    diese Methode ist einfach bei der anzahl an Dateien und Verzeichnissen zu aufwendig, das mit 100 Verzeichnissen ist nur ein Beispiel denn bei mir in der Praxis variiert es oft zwischen 100 und 10000 Verzeichnissen und das alles per Hand ist einfach zu viel (für mich).

    seeigel
    das geht zwar, aber da muss ich von jeder Datei den Ziel-Pfad kennen und per Hand in die Batch-Datei eintragen und ich möchte das durch einen Skript automatisieren und es ist bei deinem Verfahren ziemlich egal ob du copy oder move nimmst.

    wie gesagt, ich würde das gerne automatisieren, so das ich nur denn Skript etwas abändere und er die Dateien unabhängig von ihrem Namen und ihrem Standort um eine oder mehrere Verzeichnis-Ebenen verschiebt.

    mir "for /f %%i in ('dir *.mp3 /S /B')" bekomme ich ja den Quell-Pfad der Datei und unter Windows XP kann ich ja die for-Schleifen verschachteln, so das nach der ersten Durchlauf der for-Schleife dann eine zweite aufgerufen wird die dann zB. den Ziel-Pfad liefern soll, nur eben wäre das Problem bei mir, wie ich eben diesen "Unterordner" aus dem Pfad entferne oder auch mehrere Verzeichnisse aus dem Pfad entfernen kann und so einen neuen Pfad als Ziel generiert wird.

    wenn das was ich vorhabe mit Batch nicht geht, dann würde ich gerne wissen ob es ein Tool gibt dass das gleiche macht.

    Ich habe es schon versucht es selber herauszufinden und bin dabei nur auf "Directory Opus 8" gestoßen, der Hersteller von diesem Programm erwähnt das dieses Programm so etwas kann (http://www.haage-partner.de/dopus/tutorial/st.html#s_drop), aber als ich das Programm installiert und gestartet habe, habe ich von dieser Funktion nichts gefunden (wenn einer von euch weis wie es da funktioniert, dann bitte ich um einen Tipp!).

    wenn nichts klappt, dann bleibt mir nichts anderes übrig als es selber dann in C++ zu schreiben (nicht gerne, weil sehr unflexibel).

    MfG Dephender

  • ??? zu aufwendig ??? Ich muß manchmal das zehnfache verschieben. ABER ich erninnere mich sehr dunkel, das es ein Limit gibt, wieviele Dateien in einem Ordner sein dürfen und außerdem dauerts dann ewig, bis der Explorer bei dieser hohen Anzahl von Dateien in einem Ordner, den Ordner anzeigt.

    Aber ich schau mal ob ich ne DOS Lösung finde. mit FOR bist Du auf dem richtigen Weg, ich würde es aber mit:

    Code
    FOR /R [[Laufwerk:]Pfad] %Variable IN (*.mp3) DO (   Befehl [Parameter])

    machen.

    -------------------------------------------------------
    Ich habe unter "H:\Musik\Verzeichnis_001" mehrere UnterOrdner mit MP3s drin. Alle MP3s werden aus den Unterordnern nach "H:\Musik\Verzeichnis_001" verschoben.

    Folgendes cmd Script liegt im "H:\Musik\" Ordner.

  • katjarella
    mit "zu aufwendig" meine ich das ganze über Copy&Paste zu machen.

    zu deinem Skript,
    es funktioniert zwar aber nicht so wie ich es brauche, denn mit deinem Skript bist du auf diesen einen "Verzeichnis_001" angewiesen und wenn du dann das gleiche noch in "Verzeichnis_002 bis Verzeichniss_xxx" machen willst funktioniert das nicht mehr, weil du mit festen Verzeichnis-Pfaden arbeitest.

    ich glaube ich wahr mit meiner Aufgabenstellung etwas unklar,

    Ausgang:

    Code
    C:\Musik\    |    |--Verzeichnis_001\    |           |    |           |-- Unterordner_1\    |                     |    |                     |--musik_01.mp3    |                     |--musik_02.mp3    |    |--Verzeichnis_002\    |           |    |           |-- Unterordner_1\    |                     |    |                     |--musik_01.mp3    |                     |--musik_02.mp3    |    |--Verzeichnis_003\                |                |-- Unterordner_1\                          |                          |--musik_01.mp3                          |--musik_02.mp3


    Ziel

    Code
    C:\Musik\    |    |--Verzeichnis_001\    |           |    |           |--musik_01.mp3    |           |--musik_02.mp3    |    |--Verzeichnis_002\    |           |    |           |--musik_01.mp3    |           |--musik_02.mp3    |    |--Verzeichnis_003\                |                |--musik_01.mp3                |--musik_02.mp3

    und dass soll eben durch den Skript gemacht werden, ungeachtet von dem Datei- und Verzeichnis Namen.

    katjarella
    das was du mit deinem Skript gemacht hast, hätte ich so gemach.
    (ebenfalls im Verzeichnis_001 ausführen)

    Code
    SET ziel=C:\Musik\Verzeichnis_001
    for /f %%i in ('dir *.mp3 /S /B') do (move %%i %ziel%)


    das ergebniss ist zwar das gleiche, aber ich finde es etwas einfacher, ist aber leider beides für meine Aufgabe nicht das richtige.


    MfG Dephender

  • Copy&Paste ist Bedeutend schneller als Du denkst.

    Aber ich weiß schon was Du evt. machst. Du hast bestimmt so ein Online Radio Ripper der das in div. Unterverzeichnisse streamt und des willst net :)

    An Deiner Stelle würde ich das gleich in C oder einer anderen Sprache schreiben, denn mit DOS kommst Du in Teufelsküche. Denn DOS ( besonders 'dir *.mp3 /S /B' < welches überflüssig ist) kann div. Dateinamen nicht sauber lesen, kopieren, moven (Unicode, Umlaute, Sonderzeichen). Das Problem hatten wir hier schon mal und da mußte ich alles in VBSCript schreiben.

    Auch wirst Du Probleme haben wenn eine Datei schon vorhanden ist. Was dann?

    Deshalb gleich auf DOS verzichten. Wenn ich Zeit habe, versuch ich es mal anders. Aber nur wenn Zeit.

  • danke für deine mühe,
    zwar verstehe ich nicht warum 'dir *.mp3 /S /B' überflüssig ist (mit /S werden auch Unterordner mit eingeschlossen und mit /B wird nur die Datei und der dazugehörige Pfad ausgegeben), aber ich glaube auch das ich das besser in C++ schreibe und es so löse.

    was die doppelten Dateinamen angeht, das lässt sich sehr einfach mit dem "Mehrfach-Umbenennung-Tool" von TotalCommander lösen.

    und das mit den "Sonderzeichen", habe ich auch schon gelöst, dafür habe ich einen Skript geschrieben der alle Dateien auf Sonderzeichen prüft und es z.B "ä" durch "ae", sowie die " " durch "_" ersetzt.

    katjarella
    ich weis zwar nicht in wie fern deine Kenntnisse unter Linux sind, aber falls du weist wie du das unter Linux machen würdest, wäre ich dir dankbar für einen Tipp (musst ja nicht alles machen ;) ).

    EDIT: das mit ('dir *.mp3 /S /B') hat sich erledigt, da stimme ich dir jetzt auch zu.

    MfG Dephender

  • Unter Linux sage ich einfach

    PHP
    cd c:; cd musik; mmv ";*/*" "#1#3"


    mmv ist ein multi[move|link|copy|...] tool. Das Semkolon(;) steht für beliebig viele Ordner einschliesslich dem slash(/). Der Asterix(*) ist eine biliebige zeichenkette, trifft aber nur datei oder Ordnernahmen und endet spähtestens bei einem Slash.
    Soviel sum suchmuster, welches in doppelte Anführungszeichen gesetzt wird, damit die bash keine subtitution(ersetzung) durchführt. Dar zweite ausdruck gibt das Ziel an. In diesem Zeilmuster referenziert man die Wildcards mit einem hash(#)gefolgt von einer ZAHL die die Stelle im Suchmuster angibt. Beginnent mit 1.
    Das heist man kann mehr als 9 wildkards nutzen(bei regex sind es ja nur Ziffern von denen es nur 10 gibt, namenlich 0,1,2,3,4,5,6,7,8,9).
    #1 ist also das Semikolon, #2 das erste Asterix, #3 das dritte asterix(also der Dateiname).
    Daraus ergibt sich
    -gehe sotief du kanns, so das noch ein Ordner Übrig ist
    -und tuh von dort aus die Datein die einen Ordner tiefer sind in diesen Ordner.

    Das hat mir sehr oft schon geholfen. Ich entferne auf die weise z.B. Leerzeichen(mmv ";* *" "#1#2_#3") und auch sonnst findet sich immer etwas wofür man dies nutzen möchte ohne ein bashscript schreiben zu müssen. Schade das es nicht in allen Distros zum basis paket gehört, sondern immer nachinstalliert werden muss. Unter Cygwin oder eine Windows Version gibt es nicht. Das orginal war wohl mal ne DOS Version, aber die habe ich auch nicht mehr gefunden umd ob die noch unter deinem Windows läuft ist dann noch die nächste Frage. Den Source Code bekommst du z.B. unter http://packages.debian.org/unstable/utils/mmv

    Vielleich probiere ich mal ob es sich unter Cygwin compilieren läst.

    edit: Habe doch noch die DOS version gefunden. Leider nur als source.
    ftp://garbo.uwasa.fi/pc/source/mmv10src.zip
    (got es gibt noch diese uralt DOS ftp archive ?!?. Naja manchmal sind die doch noch nützlich ;) ).

    AC-Sama(Robert Vincenz)
    (werde für das -Chan zu alt :zunge: )

  • C:\Musik\Verzeichnis_001\Unterordner> move *.mp3 ..

    wäre die schnelle Variante, wenn man sich jeweils im Unterverzeichnis befindet. Nur das Wechseln in das nächste Unterverzeichnis jedes Mal wäre umständlich. Um nun alle Unterverzeichnisse zu verarbeiten, wäre etwas mehr Arbeit erforderlich, und die Ausnutzung, dass CMD.EXE auch Gruppierungen in Klammern beherrscht:

    movedown.bat

    Das cd | echo habe ich erst mal zum Testen eingefügt. Wenn die Bildschirmausgaben vernünftig aussehen, kommt es raus! ;)

    Ausgeführt wird die "movedown.bat" dann in C:\Musik.

  • Bin hierauf mit Google gestoßen und habe mir die Batchdatei darauf angepasst, alle Dateiendungen zu berücksichtigen und den überflüssigen Ordner zu löschen. Hier die angepasste Version:

    Code
    for /d %%v in (*.*) do (
    cd %%v
    for /d %%u in (*.*) do (
    cd %%u
    move *.* ..
    cd ..
    rd %%u
    )
    cd ..
    )

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!