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

  • #1
E

Error704

Mitglied
Themenersteller
Dabei seit
07.11.2010
Beiträge
8
Reaktionspunkte
0
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!

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.
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
move verschiebt auch Ordner. Mit *.* wäre ich deshalb vorsichtig - weil dies eben auch alle Ordner einschließt. Damit bleibt die Ordnerstruktur nicht erhalten!

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.


anschließend die Prüfung der Dateiendung

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!
 
Thema:

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

ANGEBOTE & SPONSOREN

Statistik des Forums

Themen
113.839
Beiträge
707.962
Mitglieder
51.492
Neuestes Mitglied
Janus36
Oben