Robocopy: как переместить содержимое каталога, но сохранить каталог

23

Простое задание:

Переместить все содержимое каталога c:\Users\files\Desktop\test 2вc:\Users\files\Desktop\test 1

C:\admin\temp>robocopy "c:\Users\files\Desktop\test 2" "c:\Users\files\Desktop\test" *.* /S /MOVE

Звучит разумно, но теперь каталог c:\Users\files\Desktop\test 2тоже удаляется. Есть ли переключатель, чтобы просто переместить содержимое без удаления самого каталога?

Perler
источник
Почему Robocopy должен отличаться от чего?
Джон Гарденье
1
Как насчет робокопии test1 test2 ... && mkdir test2
jftuga
В итоге я изменил права доступа к основному каталогу, чтобы пользователь robocopy не мог удалить сам этот каталог,
Мэтью Локк

Ответы:

14

Я пытался сделать то же самое из общего сетевого ресурса.

SET MoveDirSource=\\Server\Folder
SET MoveDirDestination=Z:\Folder

Вот мои выводы и решения из тестов на компьютере с Windows 7.

Предложение:

ROBOCOPY "%MoveDirSource%" "%MoveDirDestination%" /MOVE /E

Проблема: перемещает исходную папку.

Предложение:

ROBOCOPY "%MoveDirSource%" "%MoveDirDestination%" /MOVE /E /XD "%MoveDirSource%"

Проблема: Все еще перемещает исходную папку.

Предложение:

ROBOCOPY "%MoveDirSource%" "%MoveDirDestination%" /MOV /E

Проблема: Оставляет пустую структуру папок в исходной папке.

Рабочий раствор:

MKDIR "%MoveDirDestination%"
FOR    %%i IN ("%MoveDirSource%\*") DO           MOVE /Y "%%i" "%MoveDirDestination%\%%~nxi"
FOR /D %%i IN ("%MoveDirSource%\*") DO ROBOCOPY /MOVE /E "%%i" "%MoveDirDestination%\%%~nxi"

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

~ nxi в пункте назначения - это переменная FOR SUBSTITUTION (см. FOR /?), где ~ nxi представляет имя и расширение элемента, в данный момент проходящего через петлю.

В Robocopy по умолчанию задано значение ПОПЫТРИТЬ МИЛЛИОНЫ и ОЖИДАТЬ 30 СЕКУНД между каждой попыткой, поэтому вы можете добавить / R: 1 / W: 1 к аргументам robocopy.

WhoIsRich
источник
8

Вы пробовали / MOV вариант?

           /MOV :: MOVe files (delete from source after copying).

F:> Робокопия /?


ROBOCOPY :: Надежная копия файла для Windows

Начато: пт авг 06 11:51:26 2010

          Usage :: ROBOCOPY source destination [file [file]...] [options]

         source :: Source Directory (drive:\path or \\server\share\path).
    destination :: Destination Dir  (drive:\path or \\server\share\path).
           file :: File(s) to copy  (names/wildcards: default is "*.*").

::
:: Copy options :
::
             /S :: copy Subdirectories, but not empty ones.
             /E :: copy subdirectories, including Empty ones.
         /LEV:n :: only copy the top n LEVels of the source directory tree.

             /Z :: copy files in restartable mode.
             /B :: copy files in Backup mode.
            /ZB :: use restartable mode; if access denied use Backup mode.
        /EFSRAW :: copy all encrypted files in EFS RAW mode.

/COPY:copyflag[s] :: what to COPY for files (default is /COPY:DAT).
                   (copyflags : D=Data, A=Attributes, T=Timestamps).
                   (S=Security=NTFS ACLs, O=Owner info, U=aUditing info).

       /DCOPY:T :: COPY Directory Timestamps.

           /SEC :: copy files with SECurity (equivalent to /COPY:DATS).
       /COPYALL :: COPY ALL file info (equivalent to /COPY:DATSOU).
        /NOCOPY :: COPY NO file info (useful with /PURGE).

        /SECFIX :: FIX file SECurity on all files, even skipped files.
        /TIMFIX :: FIX file TIMes on all files, even skipped files.

         /PURGE :: delete dest files/dirs that no longer exist in source.
           /MIR :: MIRror a directory tree (equivalent to /E plus /PURGE).

           /MOV :: MOVe files (delete from source after copying).
          /MOVE :: MOVE files AND dirs (delete from source after copying).

 /A+:[RASHCNET] :: add the given Attributes to copied files.
 /A-:[RASHCNET] :: remove the given Attributes from copied files.

        /CREATE :: CREATE directory tree and zero-length files only.
           /FAT :: create destination files using 8.3 FAT file names only.
           /256 :: turn off very long path (> 256 characters) support.

         /MON:n :: MONitor source; run again when more than n changes seen.
         /MOT:m :: MOnitor source; run again in m minutes Time, if changed.

  /RH:hhmm-hhmm :: Run Hours - times when new copies may be started.
            /PF :: check run hours on a Per File (not per pass) basis.

         /IPG:n :: Inter-Packet Gap (ms), to free bandwidth on slow lines.

            /SL :: copy symbolic links versus the target.

        /MT[:n] :: Do multi-threaded copies with n threads (default 8).
                   n must be at least 1 and not greater than 128.
                   This option is incompatible with the /IPG and /EFSRAW options.
                   Redirect output using /LOG option for better performance.

::
:: File Selection Options :
::
             /A :: copy only files with the Archive attribute set.
             /M :: copy only files with the Archive attribute and reset it.
/IA:[RASHCNETO] :: Include only files with any of the given Attributes set.
/XA:[RASHCNETO] :: eXclude files with any of the given Attributes set.

/XF file [file]... :: eXclude Files matching given names/paths/wildcards.
/XD dirs [dirs]... :: eXclude Directories matching given names/paths.

            /XC :: eXclude Changed files.
            /XN :: eXclude Newer files.
            /XO :: eXclude Older files.
            /XX :: eXclude eXtra files and directories.
            /XL :: eXclude Lonely files and directories.
            /IS :: Include Same files.
            /IT :: Include Tweaked files.

         /MAX:n :: MAXimum file size - exclude files bigger than n bytes.
         /MIN:n :: MINimum file size - exclude files smaller than n bytes.

      /MAXAGE:n :: MAXimum file AGE - exclude files older than n days/date.
      /MINAGE:n :: MINimum file AGE - exclude files newer than n days/date.
      /MAXLAD:n :: MAXimum Last Access Date - exclude files unused since n.
      /MINLAD:n :: MINimum Last Access Date - exclude files used since n.
                   (If n < 1900 then n = n days, else n = YYYYMMDD date).

            /XJ :: eXclude Junction points. (normally included by default).

           /FFT :: assume FAT File Times (2-second granularity).
           /DST :: compensate for one-hour DST time differences.

           /XJD :: eXclude Junction points for Directories.
           /XJF :: eXclude Junction points for Files.

::
:: Retry Options :
::
           /R:n :: number of Retries on failed copies: default 1 million.
           /W:n :: Wait time between retries: default is 30 seconds.

           /REG :: Save /R:n and /W:n in the Registry as default settings.

           /TBD :: wait for sharenames To Be Defined (retry error 67).

::
:: Logging Options :
::
             /L :: List only - don't copy, timestamp or delete any files.
             /X :: report all eXtra files, not just those selected.
             /V :: produce Verbose output, showing skipped files.
            /TS :: include source file Time Stamps in the output.
            /FP :: include Full Pathname of files in the output.
         /BYTES :: Print sizes as bytes.

            /NS :: No Size - don't log file sizes.
            /NC :: No Class - don't log file classes.
           /NFL :: No File List - don't log file names.
           /NDL :: No Directory List - don't log directory names.

            /NP :: No Progress - don't display percentage copied.
           /ETA :: show Estimated Time of Arrival of copied files.

      /LOG:file :: output status to LOG file (overwrite existing log).
     /LOG+:file :: output status to LOG file (append to existing log).

   /UNILOG:file :: output status to LOG file as UNICODE (overwrite existing log).
  /UNILOG+:file :: output status to LOG file as UNICODE (append to existing log).

           /TEE :: output to console window, as well as the log file.

           /NJH :: No Job Header.
           /NJS :: No Job Summary.

       /UNICODE :: output status as UNICODE.

::
:: Job Options :
::
   /JOB:jobname :: take parameters from the named JOB file.
  /SAVE:jobname :: SAVE parameters to the named job file
          /QUIT :: QUIT after processing command line (to view parameters).
          /NOSD :: NO Source Directory is specified.
          /NODD :: NO Destination Directory is specified.
            /IF :: Include the following Files.
парень
источник
2
да, но это перемещает ПРОСТО файлы и оставляет каталоги нетронутыми, я хочу переместить файлы и каталоги, но сохранить сам родительский каталог на месте
perler
1
-1 ответ не отвечает на заданный вопрос
Крис Марисик
1
@Крис. Немного резких суждений. Ответ был действительным, кроме требования «родительского каталога», и я попросил разъяснений, которые были доступны только после того, как я опубликовал ответ. Используя мой ответ, вы можете использовать параметр / XD или / XA.
Парень
2
Это на самом деле идеальный ответ на этот вопрос. Используйте robocopy с переключателем "/ mov" (не переключателем "/ move") и выберите целевой каталог. Вуаля !!
Джон Гомер
1
Это НЕ идеальный ответ. Переключатель mov не будет перемещать подкаталоги. / MOV / E будет перемещать файлы, но копировать подкаталоги. Если вы хотите сохранить только родительский каталог, вы должны удалить пустые подкаталоги вручную или использовать один из других
подходящих
6

Вы можете сделать это, создав файл-заполнитель в каталоге, который вы не хотите удалять, и затем поручив робокопии исключить файл, используя / XF

Поскольку файл исключен, он не будет перемещен, а каталог не будет удален.

Для получения дополнительной информации см. Этот другой сайт: http://www.experts-exchange.com/OS/Microsoft_Operating_Systems/Windows/XP/Q_24306678.html (и прокрутите вниз, и т. Д., И т. Д.).

RedGreenCode
источник
1
Похоже, что это не так, у меня есть сам файл bat в каталоге, который я хочу скопировать, файл bat исключен, и robocopy все еще пытается удалить папку (и не удается, потому что файл bat запущен).
Крис Марисик
@ Chris-Marisic: попробуйте запустить командный файл снаружи каталога, в котором он находится. Если вы перейдете в каталог, содержащий пакетный файл, и запустите его оттуда, вы получите «Процесс не может получить доступ к файлу, поскольку он используется другим процессом», даже если вы используете / XF для исключения пакетного файла.
RedGreenCode
4

Я столкнулся с той же проблемой и просто исправил ее с помощью MKDIRкоманды после запуска robocopy.

Вы хотите переместить все содержимое данной папки, чтобы остались ТОЛЬКО родительские папки. Ну, почему бы просто не создать родительскую папку снова?

Конечно, у вас могут быть проблемы с правами пользователя, но это также можно решить.

Хенрик Ф
источник
2

Создайте уникальный файл-заполнитель, который вы исключаете из команды robocopy.

Один лайнер выглядит следующим образом:

echo.>>"C:\Source\.touch" && (robocopy "C:\Source" "C:\Dest" /XF ".touch" /MOVE /E & del "C:\Source\.touch")
SuperFisch
источник
1

Используйте переключатель / mov вместо / move

Аль Сам
источник
2
Это было предложено ранее ( serverfault.com/questions/167723/… ) и не работало.
sysadmin1138
2
Оно работает. Я делаю это прямо сейчас !!!! Как высокомерно с вашей стороны говорить, что это не сработает, если вы на самом деле не «попробуете» это !!!
Джон Гомер
2
Это не работает. / mov оставит подкаталоги на месте, а не только родительский каталог.
HugoRune
1

«Мое» решение - переместить файлы и папки во временную папку в исходной папке. (не копируйте временную папку в нее самостоятельно!) И после переместите эту папку в папку taget.

set Source=I:\_Test\ToArchive
set target=I:\_Test\Archive
set tempFolderName=@_Copy_in_progress_Do_not_use_@
set LogFile=robocopy-result.log

robocopy.exe %source% %source%\%tempFolderName% /E /MOVE /NS /NP /v /W:0 /R:0 /LOG:%LogFile% /XD %source%\%tempFolderName%
sleep 5
robocopy.exe %source%\%tempFolderName% %target% /E /MOVE /NS /NP /v /W:0 /R:0 /LOG+:%LogFile%

Я просто обнаруживаю, что «перемещение» во временную папку занимает слишком много времени. Вот обновление:

set Source=I:\_Test\ToArchive
set target=I:\_Test\Archive
set tempFolderName=@_Copy_in_progress_Do_not_use_@
set LogFile=robocopy-result.log

mkdir %source%\%tempFolderName%\
for /f "delims==" %%I IN ('dir "%source%" /B') do if NOT %%I==%tempFolderName% (move "%source%\%%I" "%source%\%tempFolderName%")
sleep 3
robocopy.exe %source%\%tempFolderName% %target% /E /MOVE /NS /NP /v /W:0 /R:0 /LOG:%LogFile%
dm101
источник
1

Мне повезло найти ответ. Я хотел переместить папку на верхний уровень диска. Я пытался:

Robocopy "<PathToFolderToMove>" "H:\" /MOVE /E

Это дало ошибку , используя следующее для назначения: H:\" \MOVE \E\.

Я догадался, что "\" избегал следующей двойной кавычки, и я изменил команду на:

Robocopy "<PathToFolderToMove>" "H:\." /MOVE /E

В итоге копирование содержимого "" в корень диска закончилось.

Таким образом, ответ на вопрос:

Robocopy "c:\Users\files\Desktop\test 2" "c:\Users\files\Desktop\test\." /MOVE /E

С уважением,
Жорж

Жорж З
источник
1

Я только что выполнил тест с использованием переключателей /mov& /e, и он отлично работает.

Отмечая из параметров командной строки, есть разница между /movи /move. Тестовый файл переместился к месту назначения, оставив структуру каталогов в исходном коде без изменений.

KNetChris
источник
-1

Почему это отличается? Это не отличается Операция перемещения - это операция копирования / удаления, независимо от того, используете вы Robocopy или нет. Вы говорите, чтобы переместить папку. Перемещение означает, что вы переезжаете в новое место и покидаете предыдущее место.

joeqwerty
источник
но это не то, что я хочу. Я хочу переместить содержимое папки, сохраняя папку. вот как это работает, стиль Unix: (редактировать, без кода в комментариях, так как на скриншоте) screencast.com/t/YTkwODIzZT
perler
-1 за вину пользователь ответит на законный вопрос
Крис Марисик
@ Крис: я не понимаю. Как я обвиняю пользователя? Он задал вопрос, и я ответил на него. Я не вижу ни малейшего обвинения в своем ответе.
Joeqwerty
Why is it different? It's not different.ОП опубликовал снимок экрана, показывающий ожидаемое поведение, как это может быть сделано с помощью * nix, но эта робокопия, по-видимому, не допускает никаких аспектов.
Крис Марисик
Да ладно, ребята, правда? Спорить по этому поводу? Я убрал вопрос, чтобы удалить "оскорбительное" (и загруженное) предложение.
Марк Хендерсон
-1

просто добавь \*

C:\admin\temp>robocopy "c:\Users\files\Desktop\test 2\*" "c:\Users\files\Desktop\test"  /S /MOVE
Tagas
источник
2
Хороший ответ - тот, у которого есть более подробное объяснение.
Касперд
он работает отлично и делает именно то, что хотел оп. также это довольно очевидно. (обратная косая черта как-то исчезла)
Тагас
1
@Tagas: Даже если работает хорошо, вы действительно должны добавить объяснение.
Свен