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จะถูกลบด้วย มีสวิตช์ให้ย้ายเนื้อหาโดยไม่ต้องลบไดเรกทอรีหรือไม่


ทำไม Robocopy ถึงแตกต่างจากอะไร
John Gardeniers


1
เกี่ยวกับ robocopy test1 test2 ... && mkdir test2
jftuga

ฉันสิ้นสุดการเปลี่ยนแปลงการอนุญาตของไดเรกทอรีหลักเพื่อให้ robocopy ของผู้ใช้ทำงานภายใต้ไม่สามารถลบไดเรกทอรีนั้นเองได้
Matthew Lock

คำตอบ:


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"

สองบรรทัดแรกย้ายไฟล์ระดับบนสุดบรรทัดที่สามย้ายโฟลเดอร์ หมายเหตุ double %% สำหรับการใช้งานในไฟล์แบตช์การวางลงในบรรทัดคำสั่งต้องการสิ่งเหล่านี้เปลี่ยนเป็นเครื่องหมายเปอร์เซ็นต์เดียว

~ nxi ในปลายทางคือ FOR SUBSTITUTION VARIABLE (ดู FOR /?) โดยที่ ~ nxi แสดงถึงชื่อและส่วนขยายของรายการที่วนซ้ำในปัจจุบัน

Robocopy มีค่าเริ่มต้นเป็น RETRY A ล้านครั้งและรอ 30 วินาทีระหว่างการลองแต่ละครั้งดังนั้นคุณอาจต้องการเพิ่ม/ R: 1 / W: 1เข้ากับอาร์กิวเมนต์ของ robocopy


8

คุณลองใช้ตัวเลือก / MOV แล้วหรือยัง

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

F:> robocopy /?


ROBOCOPY :: Robust File Copy สำหรับ Windows

เริ่มต้น: ศุกร์ 6 ส.ค. 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 คำตอบไม่ตอบคำถามที่ถาม
Chris Marisic

1
@ Chris methinks รุนแรงเล็กน้อย คำตอบนั้นถูกต้องนอกเหนือจากข้อกำหนด "ไดเรกทอรีหลัก" และฉันได้ขอคำชี้แจงซึ่งเป็นประโยชน์เพียงหลังจากฉันโพสต์คำตอบ ใช้คำตอบของฉันคุณสามารถใช้พารามิเตอร์ / XD หรือ / XA
Guy

2
นี่เป็นคำตอบที่สมบูรณ์แบบสำหรับคำถามนี้ ใช้ robocopy กับสวิตช์ "/ mov" (ไม่ใช่สวิตช์ "/ move") และกำหนดเป้าหมายไดเรกทอรีหลัก Voila !!
John Homer

1
นี่ไม่ใช่คำตอบที่สมบูรณ์แบบ สวิตช์ MOV จะไม่ย้ายไดเรกทอรีย่อย / mov / e จะย้ายไฟล์ แต่คัดลอกไดเรกทอรีย่อย หากคุณต้องการเก็บเฉพาะไดเรกทอรีหลักคุณต้องลบไดเรกทอรีย่อยที่ว่างเปล่าด้วยตนเองหรือใช้หนึ่งในคำตอบอื่น ๆ ที่ใช้งานได้
HugoRune

6

คุณสามารถทำได้โดยการสร้างไฟล์ตัวแทนในไดเรกทอรีที่คุณไม่ต้องการลบจากนั้นสั่งให้ robocopy เพื่อแยกไฟล์โดยใช้ / XF

เนื่องจากไฟล์ถูกแยกไฟล์จะไม่ถูกย้ายและไดเรกทอรีจะไม่ถูกลบ

สำหรับรายละเอียดโปรดดูเว็บไซต์อื่น ๆ : http://www.experts-exchange.com/OS/Microsoft_Operating_Systems/Windows/XP/Q_24306678.html (และเลื่อนลงไปด้านล่าง ฯลฯ )


1
ดูเหมือนจะไม่เป็นเช่นนั้นฉันมีไฟล์ bat อยู่ในไดเรกทอรีที่ฉันต้องการคัดลอกไฟล์ bat ถูกแยกออกและ robocopy ยังพยายามลบโฟลเดอร์ (และล้มเหลวเนื่องจากไฟล์ bat กำลังทำงานอยู่)
Chris Marisic

@ Chris-Marisic: ลองเรียกใช้ไฟล์แบตช์จากนอกไดเรกทอรีที่มีอยู่ หากคุณ cd ไปยังไดเรกทอรีที่มีไฟล์แบตช์และเรียกใช้จากที่นั่นคุณจะได้รับ "กระบวนการไม่สามารถเข้าถึงไฟล์เพราะมันกำลังถูกใช้โดยกระบวนการอื่น" แม้ว่าคุณจะใช้ / XF เพื่อแยกไฟล์แบตช์
RedGreenCode

4

ฉันวิ่งเข้าไปในปัญหาเดียวกันและก็คงได้กับคำสั่งหลังจากที่ผมได้เรียกใช้MKDIRrobocopy

คุณต้องการย้ายเนื้อหาทั้งหมดของโฟลเดอร์ที่กำหนดเพื่อให้เฉพาะโฟลเดอร์พาเรนต์เท่านั้น ทำไมไม่สร้างโฟลเดอร์หลักอีกครั้ง

แน่นอนว่าคุณสามารถมีปัญหาสิทธิ์ของผู้ใช้ได้ แต่ก็สามารถแก้ไขได้เช่นกัน


2

สร้างไฟล์ตัวแทนที่ไม่ซ้ำซึ่งคุณแยกออกจากคำสั่ง robocopy

หนึ่งซับมีดังนี้:

echo.>>"C:\Source\.touch" && (robocopy "C:\Source" "C:\Dest" /XF ".touch" /MOVE /E & del "C:\Source\.touch")

1

ใช้สวิตช์ / mov แทน / ย้าย


2
แนะนำก่อนหน้านี้ ( serverfault.com/questions/167723/… ) และใช้งานไม่ได้
sysadmin1138

2
มันได้ผล. ฉันทำมันตอนนี้ !!!! วิธีหยิ่งของคุณที่จะพูดว่ามันใช้งานไม่ได้หากปราศจาก "พยายาม" !!!
John Homer

2
มันไม่ทำงาน. / mov จะปล่อยให้ไดเรกทอรีย่อยเข้าแทนที่ไม่ใช่เฉพาะไดเรกทอรีหลัก
HugoRune

1

โซลูชัน "ของฉัน" คือการย้ายไฟล์และโฟลเดอร์ภายในโฟลเดอร์ชั่วคราวในโฟลเดอร์ต้นทาง (อย่าคัดลอกโฟลเดอร์ชั่วคราวไปยังโฟลเดอร์ด้วยตนเอง!) และหลังจากย้ายโฟลเดอร์นี้ไปยังโฟลเดอร์แท็ก

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%

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ไฟล์ทดสอบถูกย้ายไปยังปลายทางโดยปล่อยให้โครงสร้างไดเรกทอรีบนแหล่งข้อมูลครบถ้วน


-1

ทำไมถึงแตกต่าง มันไม่แตกต่างกัน การดำเนินการย้ายเป็นการดำเนินการคัดลอก \ ลบไม่ว่าคุณจะใช้ Robocopy หรือไม่ คุณกำลังบอกให้ย้ายโฟลเดอร์ การย้ายหมายถึงคุณย้ายไปยังตำแหน่งใหม่และย้ายตำแหน่งก่อนหน้า


แต่นั่นไม่ใช่สิ่งที่ฉันต้องการ ฉันต้องการย้ายเนื้อหาของโฟลเดอร์โดยเก็บโฟลเดอร์ไว้ ที่นี่วิธีการทำงานสไตล์ unix: (แก้ไขไม่มีรหัสในการแสดงความคิดเห็นเพื่อเป็นภาพหน้าจอ) screencast.com/t/YTkwODIzZT
perler

-1 สำหรับการตำหนิผู้ใช้ตอบคำถามที่ถูกกฎหมาย
Chris Marisic

@Chris: ฉันไม่เข้าใจ ฉันจะโทษผู้ใช้อย่างไร เขาถามคำถามและฉันตอบมัน ฉันไม่เห็นคำตำหนิในคำตอบของฉัน
joeqwerty

Why is it different? It's not different.OP โพสต์ภาพหน้าจอที่แสดงพฤติกรรมที่คาดหวังเนื่องจากสามารถทำได้ผ่าน * ระวัง แต่ robocopy นั้นดูเหมือนจะไม่อนุญาตในแง่มุมใด ๆ
Chris Marisic

พวก C'mon จริงเหรอ? เถียงมากกว่านี้? ฉันได้ล้างคำถามเพื่อลบประโยค "offending" (และโหลด)
Mark Henderson

-1

เพียงเพิ่ม \ *

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

2
คำตอบที่ดีคือคำตอบที่ให้ไว้ที่นี่
kasperd

มันทำงานได้อย่างสมบูรณ์แบบและทำในสิ่งที่ op ต้องการ นอกจากนี้ยังอธิบายได้ด้วยตนเอง (แบ็กสแลชหายไปอย่างใด)
Tagas

1
@Tagas: แม้ว่าจะใช้ได้ดี แต่คุณควรเพิ่มคำอธิบาย
สเวน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.