xcopy не создает структуру каталогов - PullRequest
13 голосов
/ 29 ноября 2011

У меня странная проблема с xcopy в Windows XP Professional. Я не знаю, является ли это глупым вопросом, так как я указываю только файл в качестве источника, так что я должен ожидать какого-либо другого поведения? Вот оно:

Я использую xcopy <src> <dest> /s/y.

<src>=C:\sourcefolder\a\b\c\d\something.java и

<dest>=C:\destinationfolder.

Теперь xcopy копирует файл, но не создает структуру каталогов \a\b\c\d\ внутри C:\destinationfolder.

я хочу C:\destinationfolder\a\b\c\d\something.java и

что я получаю C:\destinationfolder\something.java


  1. Я попытался запустить его в целевой папке C:\destinationfolder, указав . для целевой папки
  2. Пробовал без цели выше

У меня есть скрипт, который итеративно вызывает xcopy, поэтому у меня остается C:\destinationfolder\many java files без какой-либо структуры каталогов.

A. Да, я сделал xcopy /?, чтобы увидеть все варианты

B. /T также не создает пустую структуру каталогов

C. Не могу зайти в исходную папку a\b\c\d\ и запустить xcopy . <dest>

Ответы [ 6 ]

8 голосов
/ 29 ноября 2011

UPDATE

Я удалил свой предыдущий ответ, используя ROBOCOPY. Я считаю, что следующее будет делать то, что вы хотите, используя XCOPY.

Предполагая, что ваша структура папок выглядит следующим образом:

SOURCE = C:\MyJavaStuff\A\B\C\D\something.java
DEST   = C:\MyDestination

Выполнить XCOPY как это:

XCOPY C:\MyJavaStuff\something*.java C:\MyDestination /S /E

Обратите внимание на * в something*.java.

3 голосов
/ 29 ноября 2011

Проблема в том, что вы указываете, какой файл копировать в источнике.В этом случае xcopy не создаст структуру папок.Однако, если вы измените свой вызов на xcopy на

xcopy *.java C:\myfolder /s/y

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

xcopy something.jav* C:\myfolder /s/y

Редактировать

Вы говорите, что получаете списокфайлов для копирования из другой команды.Если вы можете вывести этот список файлов в текстовом файле, вы можете сделать следующее:

FOR /F "tokens=* delims=," %F in (d:\test\list.txt) DO xcopy src\%~nxF* .\dest /S /Y

Эта команда выполняет чтение текстового файла ("d: \ test \"list.txt "в данном случае), прочитайте каждую строку и для каждого файла запустите xcopy, добавив подстановочный знак в конце имени файла, чтобы убедиться, что он создает структуру папок.

Я предполагаю,вот что:

  • Вы можете получить список файлов в текстовом файле только с именами файлов (и, опционально, с путями)
  • Вы знаете исходную папку ("C:\ sourcefolder "в вашем примере, структура папок" a \ b \ c \ d "не должна быть известна) и может использоваться в команде FOR.

Вы также можете использоватьследующая форма:

FOR /F "tokens=* delims=," %F in ('cmd') DO xcopy src\%~nxF* .\dest /S /Y

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

Обратите внимание, что если вы используете эту команду FOR в командном файле, вам нужно заменить %F на %%F%~nxF* на %%~nxF*).

2 голосов
/ 30 ноября 2011

Я посмотрел на переключатели xcopy, и вы можете скопировать структуру каталогов с помощью / T, хотя это не копирует пустые каталоги, вы можете переопределить это с помощью / E. Итак, ваша команда будет выглядеть так:

xcopy C:\sourcefolder\a\b\c\d\something.java C:\destinationfolder /T /E /S /Y

Надеюсь, это поможет!

1 голос
/ 07 августа 2018

Мне кажется, что xcopy обычно используется для копирования деревьев каталогов, а не отдельных файлов (хотя это может работать). И xcopy воссоздает структуру каталогов в папке source в папке target . Если для xcopy задан ключ / i, папка target считается каталогом. Он будет создан, если он не существует, даже если необходимо создать несколько родителей.

У вас есть C: \ MyJavaStuff \ A \ B \ C \ D \ something.java - это ваш источник . В результате вы хотите получить что-то некое .java не в C: \ destinationfolder, а в C: \ destinationfolder \ A \ B \ C \ D - так что это ваша цель 1014 * У вас даже нет C: \ destinationfolder. Это нормально, с / i будет создан весь путь.

xcopy /i c:\MyJavaStuff\A\B\C\D\something.java C:\destinationfolder\A\B\C\D

Если бы что-то .java было единственным файлом в C: \ MyJavaStuff, вы также можете использовать

xcopy /sei c:\MyJavaStuff C:\destinationfolder

Это воссоздает всю древовидную структуру, копируя ваш файл. Но если в MyJavaStuff есть другие файлы (и папки), они также будут скопированы.

1 голос
/ 07 августа 2018

Я написал очень похожий командный файл с использованием xcopy. Возможно, то, что я сделал, поможет тебе.

Это команда, которую я использовал:

xcopy "c:\Data Files\Dave's Data\*.*"   "m:\Dave's Data"      /R/D /E/H

В этом случае данные Дэйва об источнике содержат целое дерево каталогов, содержащее не менее 50 000 файлов и объемом данных более 75 ГБ. Отлично работает на Windows XP

Я обнаружил, что /T не требуется, поскольку дерево каталогов копируется. Я также обнаружил, что /S не нужно, поскольку /E скопированные каталоги и подкаталоги, включая пустые. Я включил /R для копирования и перезаписи файлов только для чтения в месте назначения. /H скопированы скрытые каталоги. /D скопированы только новые файлы. Я использую это как средство ежедневного резервного копирования моих данных.

Единственная проблема, с которой я столкнулся, заключается в том, что хотя эта команда будет работать в Windows 7 в первый раз, она не будет работать при последующих запусках, когда существует целевое дерево каталогов. Я подозреваю, что это связано с проблемой привилегий, так как команда xcopy будет работать при последующих запусках в Windows 7 в окне cmd.exe.

1 голос
/ 01 декабря 2011

Чтобы получить C:\destinationfolder\a\b\c\d\something.java XCOPY необходимо знать, сколько из C:\sourcefolder\a\b\c\d\something.java нужно продублировать.

Вы можете использовать:

C:
cd \sourcefolder
XCOPY something.java* C:\destinationfolder\ /S

Имейте в виду, что это может иметь побочный эффект от копирования C:\sourcefolder\oops\something.java в C:\destinationfolder\oops\something.java, а также любых других совпадений для something*.java вC:\sourcefolder\.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...