Directory Tree einstampfen - alle Files zur Wurzel holen - aber wie?

Dieses Thema Directory Tree einstampfen - alle Files zur Wurzel holen - aber wie? im Forum "Webentwicklung, Hosting & Programmierung" wurde erstellt von Error704, 7. Nov. 2010.

Thema: Directory Tree einstampfen - alle Files zur Wurzel holen - aber wie? Hallo zusammen! Stellt Euch vor, Ihr habt die Wurzel eines Directory-Trees: F:\Fotos In der Wurzel sind jede...

  1. Hallo zusammen!

    Stellt Euch vor, Ihr habt die Wurzel eines Directory-Trees:

    F:\Fotos

    In der Wurzel sind jede Menge Unterverzeichnisse:

    F:\Fotos\1999
    F:\Fotos\2000
    \2001
    \Spanien
    usw usw usw
    F:\Fotos\Xanadu

    Also sagen wir mal, es wären 50.000 Unterverzeichnisse.
    In jedem dieser Unterverzeichnisse sind Dateien drin.


    Die Frage ist nun:

    Wie verschiebe ich alle Diese Dateien aus den Unterverzeichnissen so, daß sie danach alle im Hauptverzeichnis (F:\FOTOS) zu stehen kommen. Welche Software verwende ich für diese Verschiebeaktion?

    Vielen Dank an Euch!


    EDIT:
    Wenn im Wurzelverzeichnis nur Unterverzeichnisse drin sind, die selbst keine weiteren Unterverzeichnisse haben, dann geht folgendes:
    -folgende Verzeichnisse anlegen:
    \killtree\prog
    \killtree\input
    \killtree\output

    Den Bat hier als killtree.bat nach \prog einfügen:
    Code:
    del m:\killtree\prog\dirs.txt
    dir /ad/b m:\killtree\input\*.* > m:\killtree\prog\dirs.txt
    FOR /f usebackq delims== %%a IN (m:\killtree\prog\dirs.txt) DO COPY M:\killtree\input\%%a\*.*  m:\killtree\output\*.*
    
    Den ganzen Haufen Unterverzeichnisse nach \input. Keines der Unterverzeichnisse darf selbst Unterverzeichnisse enthalten.

    Den Bat aufrufen und das Ergebnis in \Output angucken.

    Der Nachteil ist aber die Unzulässigkeit weiterer Unterverzeichnisse. Geht es noch besser?

    EDIT2:
    Code:
    del m:\killtree\prog\dirs.txt
    dir /ad/s/b m:\killtree\input\*.* > m:\killtree\prog\dirs.txt
    FOR /f usebackq delims== %%a IN (m:\killtree\prog\dirs.txt) DO COPY %%a\*.*  m:\killtree\output\*.*
    

    Mit dem so geänderten Batch wird das Problem mit den Unterverzeichnissen umgangen. Der Baum kann jetzt aussehen wie will.

    [br][blue]*PCDpan_fee: Verschoben aus "Software-Problemlösungen"*[/blue]
     
  2. Ich würde in FOTOS folgende .CMD-Datei anlegen:
    Code:
    FOR /F tokens=* %%D IN ('DIR /S /A:D /B') DO move /-Y %%~D\*.JPG .
    und diese dann ausführen.

    Die Batchdatei sucht alle JPG in allen Unterverzeichnissen und verschiebt sie ins Verzeichnis in dem sie selbst liegt. Bei Namensgleichheit wird gefragt, ob die Zieldatei überschrieben werden soll.
     
  3. Vielen Dank! Klasse Sache!

    Hier mit Move statt Copy! Ich muß mir mal nachher genauer die Parameter angucken, damit ich das etwas verstehen kann.
    Move bringt natürlich den Vorteil, das die ganze Aktion wesentlich schneller vonstatten geht.
    Aber das beste daran ist die Mobilität. Hier wird einfach nur der Job kopiert. Der monströse Dateibaum bleibt unangetastet und muß nicht verschoben werden!
    Ich möchte aber noch bemerken, daß das mit den Fotos nur ein Beispiel war.
    Deswegen ein *.* statt des *.jpg.

    Code:
    FOR /F tokens=* %%D IN ('DIR /S /A:D /B') DO move /-Y %%~D\*.* .

    Eine weitere Frage: Stellen wir uns diesen Dateibaum noch einmal vor. Nehmen wir an, da wären Files mit vielen vielen verschiedenen Endungen, die zumindest teilweise unbekannt sind. Diese Files sollen alle gelöscht werden bis auf Files mit .jpg .bmp .gif.
    Der Dateibaum soll dabei nicht angekratzt werden, sondern es sollen alle Subdirectories erhalten bleiben.
    Wie würde man das nun dummerweise anstellen? Die zu löschenden Endungen sind ja unbekannt. Bekannt sind nur die Endungen, die bleiben sollen.

    Vielen Dank!
     
  4. move verschiebt auch Ordner. Mit *.* wäre ich deshalb vorsichtig - weil dies eben auch alle Ordner einschließt. Damit bleibt die Ordnerstruktur nicht erhalten!

    Das ist auch machbar, mit zwei verschachtelten Schleifen.
    Die erste wie gehabt zum Ermitteln der Verzeichnisstruktur. Die zweite zum Ermitteln der darin befindlichen Dateien. Die gewünschten Endungen kann man dann mit Abfragen einzeln prüfen, die bei Zutreffen den Löschbefehl überspringen.

    Edit: Es geht auch nur mit einer Schleife und dem Befehl dir /s /b /a:-D, anschließend die Prüfung der Dateiendung und Überspringen des Löschbefehls bei gewünschter Endung.
     
  5. Es sollten ja alle Files zur Wurzel geholt werden. Die restliche Ordnerstruktur ist als Müll anzusehen. Da unbekannt ist, welche Files da sind, ist ein *.* zwingend. Hier habe ich mich wohl nicht klar ausgedrückt. Mit dem move werden wohl auch alle Unterordner in die Wurzel verschoben. Das ist nicht so sinnvoll aber auch nicht extrem störend. Vielleicht nimmt man hier auch ein copy. Der geneigte Anwender hat ja jetzt Auswahlmöglichkeiten. :1

    Bevor Deine klasse Lösung kam, habe ich ja schon selbst eine entwickelt und angewendet. Die ist ebenfalls stabil und funzt ausgezeichnet.


    Genau hier haperts bei mir. In den Sprachen ist sowas Alltagswerk, im Batch habe ich aber kP, wie das zu bewerkstelligen wäre.
    Der Dir-Befehl liefert doch Path und volle Namen aller Files aber ohne die Dirs?

    Vielen Dank!
     
  6. Ich hab mal folgendes zusammengestrickt:
    Verzeichnisse, versteckte Dateien und Systemdateien werden nicht berücksichtigt (-D-H-S)
    Auch die Datei TEST.CMD ist ausgenommen... sonst löscht sich die Batchdatei selber.

    Datei TEST.CMD:
    Code:
    @echo off
    FOR /F tokens=* %%F in ('DIR /S /B /A:-D-H-S') DO CALL :TEST %%~F
    PAUSE
    GOTO :EOF
    
    :TEST
    IF /I %~n1%~x1==TEST.CMD GOTO :NICHTLOESCHEN
    IF /I %~x1==.JPG GOTO :NICHTLOESCHEN
    IF /I %~x1==.BMP GOTO :NICHTLOESCHEN
    IF /I %~x1==.GIF GOTO :NICHTLOESCHEN
    ECHO Loeschen: %~1
    DEL %~1
    GOTO :EOF
    :NICHTLOESCHEN
    ECHO Behalten: %~1
    
    :EOF
     
  7. :coolsmiley:
    Baff!
    Das muß ich erst mal verstehen!
    Du bist wirklich ein Künstler.:)
    Vielen Dank!
     
Die Seite wird geladen...

Directory Tree einstampfen - alle Files zur Wurzel holen - aber wie? - Ähnliche Themen

Forum Datum
Active-Directory Sparversion Windows Server-Systeme 6. Feb. 2014
Windows 7 und Active Directory Software: Empfehlungen, Gesuche & Problemlösungen 13. Jan. 2009
Active Directory (WinServer 2008 R2) Windows Server-Systeme 31. Mai 2011
Win7 und Freecom MediaPlayer-350 WLAN: "No shared directory on PC" Windows XP Forum 26. Okt. 2009
Active Directory über Java ansprechen Webentwicklung, Hosting & Programmierung 8. Apr. 2009