Подтвердить что ты не робот

Как перенести содержимое одного дерева каталогов в другое?

У меня есть каталог, который содержит файлы и несколько уровней подкаталогов:

C:\Source

Я хотел бы переместить содержимое C:\Source в:

C:\Destination

Требования:

  • Все файлы и все подкаталоги внутри C:\SourceData необходимо переместить
  • Я буду запускать команду в пакетный файл
  • Я не могу использовать Powershell или любые другие языки сценариев

Попытка 0

XCOPY /E "C:\Source" "C:\Destination"

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

Попытка 1

MOVE "C:\Source" "C:\Destination"

Это перемещает весь каталог C:\Source в C:\Destination, поэтому я получаю:

C:\Destination\Source

Попытка 2

С некоторой помощью этот вопрос и принятый ответ я придумал:

for /r "C:\Source" %%x in (*) do move "%%x" "C:\Destination"

Это перемещает файлы внутри C:\Source, но не подкаталоги или их содержимое. Обратите внимание, что я использовал %% x вместо% x, поскольку я использую его в пакетном файле.

Использование FOR кажется многообещающим, но я не уверен, что использовал правильный синтаксис? Я что-то пропустил?

Попытка 3

Как предложил Nick D, я попробовал переименовать:

RENAME "C:\Source" Назначение

Для примера сценария я дал это прекрасно. К сожалению, мой реальный каталог Destination находится на другом уровне в исходной папке, и это, похоже, не поддерживается:

C:\>REN /?
Renames a file or files.

RENAME [drive:][path]filename1 filename2.
REN [drive:][path]filename1 filename2.

Note that you cannot specify a new drive or path for your destination file.

Я получаю "Синтаксис команды неверен". ошибки, если я попытаюсь указать более сложный путь назначения, например:

RENAME "C:\Source" "C:\MyOtherDirectory\Destination"
RENAME "C:\Source" "MyOtherDirectory\Destination"
4b9b3361

Ответ 1

Обновление

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

В конце script исходная папка полностью удаляется, чтобы исключить эти папки, в которые их файлы были перенесены в уже существующую папку в пункте назначения (это означает, что эти папки были опустели, но не удалены в источнике).

Кроме того, мы проверяем, является ли папка пустой и уже существует в месте назначения, и в этом случае мы ничего не делаем (и оставьте исходную папку удаляемой до последней строки script). Это не приводит к тому, что "Имя файла, имя каталога или синтаксис метки тома неверны". ошибки.

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

for /d /r "c:\source" %%i in (*) do if exist "c:\destination\%%~ni" (dir "%%i" | find "0 File(s)" > NUL & if errorlevel 1 move /y "%%i\*.*" "c:\destination\%%~ni") else (move /y "%%i" "c:\destination")
move /y c:\source\*.* c:\destination
rd /s /q c:\source  

Ответ 2

Несомненно, используйте robocopy. Это простой, но блестяще полезный инструмент.

robocopy /move /e sourcedir destdir

Это приведет к перемещению всех файлов и папок, включая пустые, удаляя каждый исходный файл после его перемещения.

Если у вас нет установленной robocopy, вы можете загрузить ее самостоятельно или как часть набора ресурсов Microsoft.

Ответ 3

Так как XCOPY работает, вы можете использовать XCOPY и DELETE, это обходное решение, но должно работать?

Ответ 4

Использование Vista​​p >

robocopy source destination /MIR

/MIR .. mirror a complete directory tree (also deletes files in the destination)

еще

xcopy

Конечно, вы должны удалить источник позже:)

Ответ 5

У меня есть каталог, который содержит файлов и количество уровней подкаталогов:

C:\Source

Я хотел бы переместить содержимое C:\Источник в:

C:\Destination

Может, мне что-то не хватает, но не можете ли вы просто переименовать папку?

Ответ 6

Как отправлено на твиттер: Попробуйте объединить попытку 3 с попыткой 1. Переименуйте правильную папку назначения, затем переместите "Destination" в нужное место.

Ответ 7

@echo on
set SOURCE=C:\Source
set DESTINATION=C:\Destination

xcopy %SOURCE%\* %DESTINATION%\* /s /e /i /Y

PAUSE

Я использую командный файл, подобный этому...

или просто вызовите:

xcopy C:\Source\* C:\Destination\* /s /e /i /Y

Ответ 8

Может быть, немного не по теме, но все же полезно:

Некоторые люди предлагают просто скопировать + удалить исходные файлы, но перемещение файлов не совпадает с копированием и удалением!

При использовании функции (x) copy вы выделите новое пространство на том том том объеме на жестком диске. После копирования файлов файлы старые (старое выделенное пространство, необходимое для файлов) были отмечены как удален. Пока вы достигнете того же результата, что и конечный пользователь, перемещение делает что-то другое и более эффективное.

Перемещение файлов фактически изменяет только некоторые записи в MFT (таблица основных файлов). Эти изменения состоят только из другого пути, по которому пользователь может найти свои файлы. Физически файлы остаются в тех же секторах на жестком диске.

Ответ 9

В ответ на ответ ufukgun:

xcopy C:\Source\* C:\Destination\* /s /e /i /Y

/s - копирует каталоги и подкаталоги, кроме пустых. /e - копирует каталоги и подкаталоги, включая пустые. То же, что и /S/E. Может использоваться для изменения /T.
/i - Если адресат не существует и копируется более одного файла, предполагается, что конечным пунктом должен быть каталог.
/y - подавляет запрос на подтверждение того, что вы хотите перезаписать существующий файл назначения.

Как указано в другом ответе, использование xcopy может быть не столь эффективным, как это было бы командой native move, которая только изменяет указатели в файловой системе.

Ответ 10

Я думаю, что самое легкое, что вы могли бы сделать, это изменить свою попытку 2

от

MOVE "C:\Source" "C:\Destination"

к

MOVE "C:\Source\*" "C:\Destination"

KISS; -)

Изменить: это, похоже, не сработает, поэтому мой совет состоит в том, чтобы избавиться от дрянной командной строки DOS и использовать Cygwin с BASH как оболочкой! (или просто добавьте двоичные файлы cygwin в путь, чтобы вы могли использовать mv внутри DOS, поэтому не нужно менять оболочку как состояние ваших требований).

Ответ 11

Если все, что вы пытаетесь сделать, это переместить каталог и содержимое на один уровень:

MOVE folder_you_wan_to_move ..

Обратите внимание, что.. ссылается на следующий каталог вверх.

Ответ 12

Я использую утилиту xxcopy. Он может перемещать файлы и иметь много полезных опций, вы можете использовать его следующим образом:

xxcopy C:\Source C:\Destination /E /RC

параметры:

  • /E, чтобы скопировать все даже пустые папки

  • /RC для удаления каждого исходного файла после каждой успешной копии

вы можете скачать бесплатную копию xxcopy для личного использования: http://www.xxcopy.com/xcpydnld.htm