Ich habe eine Dateihierarchie wie diese:
RootDir
/A
/fileA.txt
/B
/C
/fileC.txt
/fileB.txt
/otherFile1.txt
/otherFile2.txt
Ich möchte nur die Unterverzeichnisse (also A
, B
) kopieren undalles unter ihnen(das heißt, ich möchte, dass alles kopiert wird, AUSSER otherFile1.txt
und otherFile2.txt
).
Es gibt viel mehr als 2 Verzeichnisse und 2 Dateien unter dem Stammverzeichnis, deshalb möchte ich nicht jedes einzelne namentlich angeben.
Irgendwelche Vorschläge?
Antwort1
Sie können eine Kombination ausfür /f,xkopieUnddirSo führen Sie diese Aufgabe aus:
cd SOURCE
for /F "delims=" %a in ('dir /B /AD') do @xcopy /E "%a" "DESTINATION\%a\"
Wie es funktioniert:
Sobald Sie dasQUELLEVerzeichnis, der Befehl
dir /B /AD
listet alle Verzeichnisse (/AD
) zeilenweise auf (/B
).for /F "delims=" %a in ('...') do
geht die Ausgabe des Befehls durch...
, setzt die Variable%a
auf die nächste Ausgabezeile und führt aus, was folgtdo
.Hier
delims=
wird sichergestellt, dass die Variable den gesamten Zeileninhalt enthält. Ohne sie%a
würden nur die Zeichen bis zum ersten Leerzeichen enthalten sein.xcopy /E "%a" "DESTINATION\%a\"
kopiert das aktuell in angegebene Verzeichnis%a
in einen gleichnamigen Ordner im VerzeichnisZIEL. Der/E
Schalter bewirkt, dass der Inhalt des Verzeichnisses ebenfalls kopiert wird. 1Die Angabe des Verzeichnisnamens im Ziel ist unbedingt erforderlich. Ohne diese Angabe würde nach (anstatt )
fileA.txt
kopiert .DESTINATION\fileA.txt
DESTINATION\A\fileA.txt
Der abschließende Backslash zeigt an, dass es
%a
sich um den Namen eines Verzeichnisses und nicht um eine Datei handelt. Die doppelten Anführungszeichen sind erforderlich, um Verzeichnisnamen mit Leerzeichen richtig zu behandeln.
Wenn dieser Befehl in einer Batchdatei verwendet werden soll, müssen alle Prozentzeichen mit einem zweiten Prozentzeichen maskiert werden, d. h. %a
aus wird zu %%a
.
1 /E
kopiert auch leere Verzeichnisse. Wenn dies nicht gewünscht ist, können Sie /S
stattdessen verwenden.
Antwort2
Ähnlich den Antworten von Dennis und David Ruhmann, jedoch wird eine FOR /D-Schleife statt FOR /F verwendet.
for /d %F in (rootFolderPath\*) do @xcopy /e /i "%F" "destinationPath\%~nxF"
Antwort3
Der beste Weg, der mir einfällt, ist die Verwendung des Robocopy-Schalters "/create", der nur die gesamte Ordnerstruktur kopiert, und "Nur Dateien mit der Länge 0" - was mit Sicherheit dazu führen würde, dass alle Ihre Dateien ausgeschlossen werden
Robocopy /e /create \(Quellpfad von Ordner A) \(Zielpfad)
Robocopy /e /create \(Quellpfad von Ordner B) \(Zielpfad)
Sie können auch (wenn es sich um den gleichen Dateityp handelt oder nur um eine kleine Anzahl bekannter Dateitypen) den Schalter „Datei ausschließen“ „/xf“ verwenden und die Dateitypen mit Platzhaltern wie folgt ausschließen:
Robocopy /e (Quellpfad von Ordner A) (Zielpfad) /xf *.txt
Robocopy /e (Quellpfad von Ordner B) (Zielpfad) /xf *.txt
Antwort4
Native Windows CMD-Lösung. Kopieren Sie nur die Unterordner (und deren Inhalt) aus einem RootDir.
for /f "delims=" %%A in ('dir RootDir /a:d /b') do xcopy %%A DestDir /e /i