Windows-Befehlszeile: Wie kopiere ich Unterverzeichnisse (keine Dateien) unter ein bestimmtes Stammverzeichnis?

Windows-Befehlszeile: Wie kopiere ich Unterverzeichnisse (keine Dateien) unter ein bestimmtes Stammverzeichnis?

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.txtund 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 /ADlistet alle Verzeichnisse ( /AD) zeilenweise auf ( /B).

  • for /F "delims=" %a in ('...') dogeht die Ausgabe des Befehls durch ..., setzt die Variable %aauf die nächste Ausgabezeile und führt aus, was folgt do.

    Hier delims=wird sichergestellt, dass die Variable den gesamten Zeileninhalt enthält. Ohne sie %awürden nur die Zeichen bis zum ersten Leerzeichen enthalten sein.

  • xcopy /E "%a" "DESTINATION\%a\"kopiert das aktuell in angegebene Verzeichnis %ain einen gleichnamigen Ordner im VerzeichnisZIEL. Der /ESchalter bewirkt, dass der Inhalt des Verzeichnisses ebenfalls kopiert wird. 1

    Die Angabe des Verzeichnisnamens im Ziel ist unbedingt erforderlich. Ohne diese Angabe würde nach (anstatt ) fileA.txtkopiert .DESTINATION\fileA.txtDESTINATION\A\fileA.txt

    Der abschließende Backslash zeigt an, dass es %asich 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. %aaus wird zu %%a.


1 /E kopiert auch leere Verzeichnisse. Wenn dies nicht gewünscht ist, können Sie /Sstattdessen 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

verwandte Informationen