Как я могу переместить содержимое одного дерева каталогов в другое? - PullRequest
19 голосов
/ 13 июля 2009

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

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

Как подсказал Ник D, я попытался переименовать:

ПЕРЕИМЕНОВАТЬ "C: \ Source" Пункт назначения

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

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"

Ответы [ 13 ]

25 голосов
/ 13 июля 2009

Несомненно, используйте Robocopy. Это простой, но чрезвычайно полезный инструмент.

robocopy /move /e sourcedir destdir

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

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

11 голосов
/ 13 июля 2009

Обновление

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

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

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

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

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  
1 голос
/ 08 июня 2017

В ответ на ответ уфукгуна:

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

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

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

1 голос
/ 31 декабря 2016

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

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

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

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

1 голос
/ 13 июля 2009
@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
1 голос
/ 13 июля 2009

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

1 голос
/ 13 июля 2009

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

C: \ Source

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

C: \ Destination

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

1 голос
/ 13 июля 2009

при использовании Vista

robocopy source destination /MIR

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

еще

xcopy

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

1 голос
/ 13 июля 2009

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

0 голосов
/ 16 марта 2018

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

Если ваш S.O не на английском языке, необходимо заменить строку 6 текстом, используемым командой Dir, когда он находит 0 файлов.

moveir.bat source_dir destination_dir

@echo off
SETLOCAL  ENABLEDELAYEDEXPANSION

if %1.==. echo movedir dir1[\*] dir2 & echo move dir1 inside dir2 overwriting coincident files & echo option \* moves only dir1 content & goto end

set S=%~f1
set D=%~f2
set "noFiles= 0 File"
set "R=0"         rem R is option [\*] flag

if %S:~-2%.==\.. set "S=%S:~,-2%" & set "R=1"

if not exist "%S%" goto paramERR
if not exist "%D%" goto paramERR

set "Trim=0" & set "Sc=%S%"
:LP
set /A Trim+=1 & (set "Sc=!Sc:~1!") & if NOT !Sc!.==. goto LP

if %R%==0 (if exist "%D%\%~n1%~x1" (set "D=%D%\%~n1%~x1")) else move /y "%S%" "%D%" & goto end

CALL:movefiles "%S%" "%D%"
for /D /R "%S%" %%I in (*) do (set "Way=%%~fI") & (set "Way=!Way:~%Trim%!") & if exist "%D%!Way!" (CALL:movefiles "%%I" "%D%!Way!") else (move /y "%%I" "%D%!Way!\.." > NUL)
rd /s/q "%S%" & if %R%==1 md "%S%"
goto end

:movefiles 
dir %1 | find "%noFiles%" > NUL & if ERRORLEVEL 1 move /y "%~1\*.*" %2 > NUL 
goto :eof

:paramERR
echo Source or Destination does not exist
:end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...