Вопрос по windows, cmd, batch-file – Как я могу переместить содержимое одного дерева каталогов в другое?

18

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

C:\Source

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

C:\Destination

Требования:

All files and all subdirectories within C:\SourceData must be moved I will be running the command in a batch file I can't use Powershell or any other scripting languages

Attempt 0

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

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

Attempt 1

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

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

C:\Destination\Source

Attempt 2

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

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

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

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

Attempt 3

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

ПЕРЕИМЕНОВАТЬ & quot; C: \ Source & quot; Место назначения

Для примера сценария, который я дал, это прекрасно работает. К сожалению мой настоящий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.

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

RENAME "C:\Source" "C:\MyOtherDirectory\Destination"
RENAME "C:\Source" "MyOtherDirectory\Destination"
Если RENAME работает, как вы хотели, то вы могли бы переместиться в нужную папку с временным именем, а затем переименовать :) eglasius
В то время как MOVE переместит «источник»into & Quot; назначение & Quot; если & quot; пункт назначения & quot; уже существует, он будет перемещен "источник"to & Quot; назначение & Quot; если он еще не существует Jason Musgrove

Ваш Ответ

13   ответов
1

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

0

иметь много полезных опций, вы можете использовать его так:

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

варианты:

/E to copy everything even empty folders

/RC to remove every source file after each successful copy

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

1

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

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

Update:

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

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

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

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

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  
Хм, может быть, это не работает в конце концов. Я получаю "Неверный синтаксис имени файла, имени каталога или метки тома". при запуске команды перемещения. Tom Robinson
Спасибо, я попробую, но время истекло. В конце концов я выбрал опцию robocopy, так как ее легче читать и понимать тем, кто наследует мой код позднее. Tom Robinson
Хорошо, я значительно обновляю ответ, чтобы попытаться решить проблемы, с которыми я столкнулся, во-первых, надеюсь, что сейчас это решено!
Ура! Это действительно было предположение, если честно. Заметил / D на экране справки и сделал снимок ... Я обновил %% i вещь :)
Мне нужно было изменить команду FOR, чтобы использовать %% i вместо% i (как это происходит в пакетном файле), но в остальном она прекрасно работает. Спасибо! Tom Robinson
1
@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
Что делают эти переключатели / s / e / i / Y? Они заставляют это перемещать файлы, а не копировать их? Tom Robinson
1

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

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

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

1

robocopy source destination /MIR

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

еще

xcopy

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

да, было бы. Вам понадобится robocopy / MOVE not / MIR
Это работало бы во многих случаях, но, к сожалению, я не могу скопировать, а затем удалить источник, поскольку я перемещаю очень большой набор файлов, и на диске недостаточно места, чтобы иметь две копии за раз. Я уточнил вопрос, чтобы прояснить это, я должен был упомянуть об этом раньше. Tom Robinson
0

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

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

movedir.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
0

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

MOVE folder_you_wan_to_move ..

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

24

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

robocopy /move /e sourcedir destdir

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

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

+1: я забыл о способности робокопии двигаться (должно быть, это имя!). В моем случае я не могу полагаться на установку robocopy, но я мог бы легко включить двоичный файл вместе со сценарием. Tom Robinson
Да, и что приятно, у него нет никаких зависимостей; это всего лишь один .exe и он отлично работает на Vista, Server 2003, 2008 и т. д. Если вы можете сохранить его с помощью сценария, у вас будет надежный и надежный процесс.
Это хороший ответ, но сначала он копируется, а затем удаляется. Если вы перемещаете большую структуру каталогов, это займет некоторое время. Хотя ручное перемещение его в проводнике было бы почти мгновенным, потому что все, что он делал, это обновлял MFT.
1

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

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

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

Если бы вы не использовали xcopy или Robocopy, что бы вы предложили для перемещения папок?
0

что самое простое, что вы можете сделать, это изменить вашу попытку 2

от

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

в

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

ПОЦЕЛУЙ ;-)

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

не так ли? : -А что за хрень ...
Это очень просто, но не работает. Подкаталоги в C: \ Source не копируются Tom Robinson
1

files and a number of levels of subdirectories:

C:\Source

I would like to move the contents of C:\Source into:

C:\Destination

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

К сожалению, это не работает, если каталог назначения не находится на том же уровне, что и каталог источника. Я добавлю больше деталей к вопросу, а не к этому блоку комментариев. Tom Robinson

Похожие вопросы