it-swarm.com.ru

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

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

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"
18
Tom Robinson

Обновление :

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

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

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

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

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  
11
ljs

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

robocopy /move /e sourcedir destdir

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

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

23
DavidMWilliams

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

1
David Webster

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

1
StuperUser

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

 robocopy исходный пункт назначения /MIR

/MIR .. отражает полное дерево каталогов (также удаляет файлы в месте назначения) 

else

 Хсор 

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

1
Dynamicbyte
@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
ufukgun

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

C:\Source

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

C:\Destination

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

1
Nick Dandoulakis

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

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

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

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

1
Fluxzoal

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

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

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

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

1
axelitus

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

MOVE folder_you_wan_to_move ..

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

0
Heber

Я оставляю этот код, написанный мною на основе попытки 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
0
marc r p

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

от

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

в

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

ПОЦЕЛУЙ ;-)

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

0
fortran

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

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

варианты:

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

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

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

0
Abdulkarim Hamad