Командная строка Windows: как скопировать подкаталоги, а не файлы, в заданный корневой каталог?

Командная строка Windows: как скопировать подкаталоги, а не файлы, в заданный корневой каталог?

У меня такая иерархия файлов:

RootDir
  /A
    /fileA.txt
  /B
    /C
       /fileC.txt
    /fileB.txt
  /otherFile1.txt
  /otherFile2.txt

Я хотел бы скопировать только подкаталоги (например A, B) ивсе, что под ними(то есть я хочу, чтобы было скопировано все, КРОМЕ otherFile1.txtи otherFile2.txt).

В корневом каталоге находится гораздо больше двух каталогов и двух файлов, поэтому я бы не стал указывать каждый из них по имени.

Какие-либо предложения?

решение1

Вы можете использовать комбинациюдля /ф,xcopyиреждля выполнения этой задачи:

cd SOURCE
for /F "delims=" %a in ('dir /B /AD') do @xcopy /E "%a" "DESTINATION\%a\"

Как это работает:

  • Как только вы войдете вИСТОЧНИКкаталог, команда dir /B /ADвыводит список всех каталогов ( /AD), построчно ( /B).

  • for /F "delims=" %a in ('...') doпросматривает вывод команды ..., устанавливает переменную %aна следующую строку вывода и выполняет все, что следует за ней do.

    Здесь delims=гарантирует, что переменная содержит все содержимое строки. Без нее %aбудут храниться только символы до первого пробела.

  • xcopy /E "%a" "DESTINATION\%a\"копирует текущий указанный каталог в %aпапку с тем же именем в каталогеМЕСТО НАЗНАЧЕНИЯ. /EПереключатель также копирует содержимое каталога. 1

    Указание имени каталога в месте назначения является обязательным. Без него fileA.txtбудет скопировано в DESTINATION\fileA.txt(а не DESTINATION\A\fileA.txt).

    Завершающий обратный слеш используется для указания того, что %aэто имя каталога, а не файла. Двойные кавычки необходимы для правильной обработки имен каталогов, содержащих пробелы.

Если эта команда будет использоваться внутри пакетного файла, все знаки процента должны быть экранированы вторым знаком процента, т. е. %aстанет %%a.


1 /E копирует также пустые каталоги. Если это нежелательно, можно использовать /Sвместо этого.

решение2

Аналогично ответам Денниса и Дэвида Руманнов, но с использованием цикла FOR /D вместо FOR /F.

for /d %F in (rootFolderPath\*) do @xcopy /e /i "%F" "destinationPath\%~nxF"

решение3

Лучший способ, который я могу придумать, — это использовать переключатель Robocopy «/create», который копирует только всю структуру папок, и «только файлы нулевой длины» — что, я уверен, приведет к исключению всех ваших файлов.

Robocopy /e /create \(исходный путь к папке A) \(конечный путь)

Robocopy /e /create \(исходный путь к папке B) \(конечный путь)

Вы также можете (если все типы файлов одинаковые или известно небольшое количество типов файлов) использовать переключатель «Исключить файл» «/xf» и исключить типы файлов с помощью подстановочных знаков, например:

Robocopy /e (исходный путь папки A) (конечный путь) /xf *.txt

Robocopy /e (исходный путь папки B) (конечный путь) /xf *.txt

решение4

Собственное решение Windows CMD. Копировать только подпапки (и их содержимое) из RootDir.

for /f "delims=" %%A in ('dir RootDir /a:d /b') do xcopy %%A DestDir /e /i

Связанный контент