Dateien aus Unterverzeichnissen zusammenfĂĽhren

Ich suche bisher vergeblich eine Batch-Datei, um Dateien eines bestimmten Typs, etwa Bilder im JPEG-Format von einem Verzeichnis mit Unterverzeichnissen in ein Verzeichnis ohne Unterverzeichnisse zu kopieren und möglichst noch eine Textdatei zu erzeugen, in der die Dateipfade und Dateigrößen der gefundenen Dateien aufgelistet sind. Die Dateien über die Suchfunktion des Windows-Explorers herauszufiltern, ist für mich nicht praktikabel, da es sich um mehrere tausend Bilder handelt.

vorlesen Druckansicht 9 Kommentare lesen
Lesezeit: 2 Min.

Ich suche bisher vergeblich eine Batch-Datei, um Dateien eines bestimmten Typs, etwa Bilder im JPEG-Format von einem Verzeichnis mit Unterverzeichnissen in ein Verzeichnis ohne Unterverzeichnisse zu kopieren und möglichst noch eine Textdatei zu erzeugen, in der die Dateipfade und Dateigrößen der gefundenen Dateien aufgelistet sind. Die Dateien über die Suchfunktion des Windows-Explorers herauszufiltern, ist für mich nicht praktikabel, da es sich um mehrere tausend Bilder handelt.

Im Prinzip ist das Problem mit einem länglichen Einzeiler nach dem Muster

for /f %f in ('dir /b /s c:\Bilder\*.jpg') do xcopy %f d:\Backup 

erledigt. Wie immer steckt der Teufel allerdings im Detail: Datei- und Ordnernamen können Leerzeichen enthalten, und beim Zusammenkopieren aus einem Ordnerbaum in einen einzigen Ordner können Dateinamen doppelt vorkommen. Solche Fallen umgehen Sie mit der Batch-Datei im Kasten auf der nächsten Seite, die Sie auch über den unten stehenden Link finden.

Der eigentliche Kern des Skripts ist der Block, der mit der Zeile

for /f "tokens=*" %%f in ('dir /b /s "%quellwurzel%\%maske%"') 

beginnt. Im Vergleich zum obigen Einzeiler hat das for noch die Option “tokens=*“ dazubekommen, damit Dateinamen nicht an Leerzeichen auseinandergerissen werden. Die Schleife iteriert über die Ausgabe des Befehls

dir /b /s "%quellwurzel%\%maske%" 

Dabei bezieht dir alle Unterordner mit ein (/s) und verwendet ein einfaches Ausgabeformat (/b). Die Anführungszeichen sind wieder möglichen Leerzeichen geschuldet. Die Optionen des Kopierbefehls

xcopy /h /i /k /d /y "%%f" "%ziel%" 

bewirken, dass xcopy versteckte Dateien einschließt (/h), Attribute mitkopieren (/k) und das Ziel als Ordnername auffasst (/i). Bei doppelten Dateinamen soll eine neuere Datei nicht von einer älteren überschrieben werden (/d), andersrum soll xcopy beim Überschreiben einer älteren Datei durch eine neuere aber nicht mehr nachfragen (/y). Das folgende

|find /v „Datei(en) kopiert“ 

unterdrĂĽckt die Zusammenfassung, die xcopy nach jedem Aufruf ausgibt. Achtung: Wenn Sie die Option /y bei xcopy entfernen, um selbst zu entscheiden, ob Dateien ĂĽberschrieben werden sollen, mĂĽssen Sie auch den find-Befehl opfern, denn sonst bekommen Sie die Frage nicht zu sehen.

Die Ausgabe der Namen der kopierten Dateien und ihrer Größe in eine Log-Datei erledigt die letzte Zeile mit dem Kommando dir im Ursprungsverzeichnis.

www.ctmagazin.de/0922162

Mehr Infos

Das Skript FlatCopy kopiert Dateien aus Unterverzeichnissen in einen Ordner zusammen.

@echo off
if %2. == . (
echo Nicht genug Parameter.
echo Aufruf: %~n0 ^<Quelle^> ^<Ziel^> [Maske]
echo Beispiel: %~n0 c:\Bilder d:\Backup *.jpg
echo Kopiert alle *.jpg-Dateien aus c:\Bilder und Unterordnern "flach"
echo nach d:\Backup. Ist [Maske] nicht angegeben, werden alle Dateien
echo kopiert.
exit /b
)

setlocal
set quellwurzel=%~f1
set ziel=%~f2
set maske=%3
if %maske%. == . set maske=*
echo Kopiere %maske% von %quellwurzel% nach %ziel% ...

for /f "tokens=*" %%f in ('dir /b /s "%quellwurzel%\%maske%"') do (
xcopy /h /i /c /k /d /y "%%f" "%ziel%" |find /v "Datei(en) kopiert"
)

dir /s "%quellwurzel%\%maske%" > %~n0.log

(hos)