Robocopy: So verschieben Sie den Inhalt eines Verzeichnisses, aber BEHALTEN Sie das Verzeichnis

23

Einfache Aufgabe:

Verschieben Sie den gesamten Inhalt des Verzeichnisses c:\Users\files\Desktop\test 2inc:\Users\files\Desktop\test 1

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

Klingt vernünftig, aber jetzt wird auch das Verzeichnis c:\Users\files\Desktop\test 2entfernt. Gibt es einen Schalter, um nur den INHALT zu verschieben, ohne das Verzeichnis selbst zu entfernen?

Perler
quelle
Warum muss Robocopy anders sein als was?
John Gardeniers
1
Was ist mit robocopy test1 test2 ... && mkdir test2
jftuga
Am Ende habe ich die Berechtigungen des Hauptverzeichnisses geändert, sodass der Benutzer, unter dem robocopy ausgeführt wurde, dieses Verzeichnis nicht selbst löschen konnte.
Matthew Lock

Antworten:

14

Ich habe versucht, dasselbe von einer Netzwerkfreigabe aus zu tun.

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

Hier sind meine Ergebnisse und Lösungen aus Tests auf einem Windows 7-Computer.

Vorschlag:

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

Problem: Verschiebt den Quellordner.

Vorschlag:

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

Problem: Verschiebt weiterhin den Quellordner.

Vorschlag:

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

Problem: Lässt leere Ordnerstruktur im Quellordner zurück.

Arbeitslösung:

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

In den ersten beiden Zeilen werden Dateien der obersten Ebene verschoben, in der dritten Zeile Ordner. Beachten Sie, dass das doppelte %% für die Verwendung in einer Batch-Datei vorgesehen ist. Beim Einfügen in eine Befehlszeile müssen diese in eine einzelne Prozentmarke geändert werden.

~ nxi im Ziel ist eine FOR SUBSTITUTION VARIABLE (Siehe FOR /?), wobei ~ nxi den Namen und die Erweiterung des Elements darstellt, das gerade durchgeschleift wird.

Die Standardeinstellung für Robocopy lautet MILLIONEN-WIEDERHOLEN und WARTEN zwischen jedem Versuch 30 SEKUNDEN. Fügen Sie daher möglicherweise / R: 1 / W: 1 zu den Robocopy-Argumenten hinzu.

WhoIsRich
quelle
8

Haben Sie die Option / MOV ausprobiert?

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

F:> Robokopie /?


ROBOCOPY :: Robust File Copy für Windows

Gestartet: Fr 06. August, 11:51:26 Uhr 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.
Kerl
quelle
2
ja, aber dies verschiebt nur die Dateien und lässt die Verzeichnisse unberührt, ich möchte die Dateien und die Verzeichnisse verschieben, aber das übergeordnete Verzeichnis selbst an Ort und Stelle halten
Perler
1
-1 Antwort beantwortet die gestellte Frage nicht
Chris Marisic
1
@ Chris. Ein bisschen hart überlegt. Die Antwort war gültig, abgesehen von der Anforderung "übergeordnetes Verzeichnis", und ich bat um Klärung, was erst verfügbar war, nachdem ich die Antwort gepostet hatte. Mit meiner Antwort können Sie den Parameter / XD oder / XA verwenden.
Guy
2
Dies ist eigentlich die perfekte Antwort auf diese Frage. Verwenden Sie robocopy mit dem Schalter "/ mov" (nicht mit dem Schalter "/ move") und richten Sie das übergeordnete Verzeichnis als Ziel aus. Voila !!
John Homer
1
Dies ist NICHT die perfekte Antwort. Der Mov-Schalter verschiebt keine Unterverzeichnisse. / mov / e verschiebt Dateien, kopiert jedoch Unterverzeichnisse. Wenn Sie nur das übergeordnete Verzeichnis behalten möchten, müssen Sie die leeren Unterverzeichnisse manuell entfernen oder eine der anderen Antworten verwenden, die funktionieren
HugoRune
6

Sie können dies tun, indem Sie eine Platzhalterdatei in dem Verzeichnis erstellen, das Sie nicht löschen möchten, und Robocopy dann anweisen, die Datei mit / XF auszuschließen

Da die Datei ausgeschlossen wird, wird sie nicht verschoben und das Verzeichnis wird nicht gelöscht.

Einzelheiten finden Sie auf dieser anderen Website: http://www.experts-exchange.com/OS/Microsoft_Operating_Systems/Windows/XP/Q_24306678.html (und scrollen Sie nach unten usw. usw.).

RedGreenCode
quelle
1
Dies scheint nicht der Fall zu sein, ich habe die Bat-Datei selbst in dem Verzeichnis, das ich kopieren möchte, die Bat-Datei ist ausgeschlossen und Robocopy versucht immer noch, den Ordner zu löschen (und schlägt fehl, weil die Bat-Datei ausgeführt wird).
Chris Marisic
@ Chris-Marisic: Versuchen Sie, die Batch-Datei von außerhalb des Verzeichnisses auszuführen, in dem sie sich befindet. Wenn Sie in das Verzeichnis mit der Stapeldatei wechseln und von dort aus ausführen, erhalten Sie die Meldung "Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird", auch wenn Sie die Stapeldatei mit / XF ausschließen.
RedGreenCode
4

Ich bin auf dasselbe Problem gestoßen und habe es mit dem MKDIRBefehl behoben, nachdem ich das ausgeführt habe robocopy.

Sie möchten den gesamten Inhalt eines bestimmten Ordners verschieben, sodass NUR die übergeordneten Ordner zurückbleiben. Warum nicht einfach den übergeordneten Ordner neu erstellen?

Natürlich können Sie einige Probleme mit Benutzerrechten haben, aber das kann auch gelöst werden.

Henrik F
quelle
2

Erstellen Sie eine eindeutige Platzhalterdatei, die Sie vom Befehl robocopy ausschließen.

Ein Liner ist wie folgt:

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

Verwenden Sie den Schalter / mov anstelle von / move

Al Sam
quelle
2
Es wurde zuvor vorgeschlagen ( serverfault.com/questions/167723/… ) und funktionierte nicht.
sysadmin1138
2
Es klappt. Ich mache es gerade !!!! Wie arrogant von dir zu sagen, dass es nicht funktioniert, ohne es wirklich zu "versuchen" !!!
John Homer
2
Es funktioniert nicht. / mov belässt die Unterverzeichnisse und nicht nur das übergeordnete Verzeichnis.
HugoRune
1

"Meine" Lösung besteht darin, Dateien und Ordner in einen temporären Ordner im Quellordner zu verschieben. (Kopieren Sie den temporären Ordner nicht selbst!) Verschieben Sie diesen anschließend in den Taget-Ordner.

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%

Ich stelle nur fest, dass das "Verschieben" in den temporären Ordner zu viel Zeit in Anspruch nimmt. Hier das Update:

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
quelle
1

Ich hatte Glück, die Antwort zu finden. Ich wollte einen Ordner auf die oberste Ebene einer Festplatte verschieben. Ich habe es versucht:

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

Es gab einen Fehler die folgenden für das Ziel mit: H:\" \MOVE \E\.

Ich vermutete, dass das "\" dem folgenden doppelten Anführungszeichen entging, und änderte den Befehl in:

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

Schließlich wurde der Inhalt von "" in das Stammverzeichnis des Laufwerks kopiert.

Die Antwort auf die Frage lautet also:

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

Grüße,
Georges

Georges Z
quelle
1

Ich habe gerade einen Test mit den Schaltern /mov& durchgeführt /e, und er funktioniert einwandfrei.

In den Befehlszeilenoptionen gibt es einen Unterschied zwischen /movund /move. Die Testdatei wurde zum Ziel verschoben, wobei die Verzeichnisstruktur auf der Quelle intakt blieb.

KNetChris
quelle
-1

Warum ist es anders? Das ist nicht anders. Ein Verschiebevorgang ist ein Kopier- / Löschvorgang, unabhängig davon, ob Sie Robocopy verwenden oder nicht. Sie sagen, dass der Ordner verschoben werden soll. Umzug bedeutet, dass Sie an den neuen Standort umziehen und den vorherigen Standort verlassen.

Joeqwerty
quelle
aber das ist nicht was ich will. Ich möchte den Inhalt des Ordners verschieben und den Ordner behalten. hier , wie es funktioniert, Unix - Stil: (edit, keinen Code in den Kommentaren, so als Screenshot) screencast.com/t/YTkwODIzZT
perler
-1 für die Schuld des Benutzers Antwort auf legitime Frage
Chris Marisic
@ Chris: Ich verstehe nicht. Wie beschuldige ich den Benutzer? Er stellte eine Frage und ich beantwortete sie. In meiner Antwort sehe ich keinen Hinweis auf Schuldzuweisungen.
Joeqwerty
Why is it different? It's not different.Das OP hat einen Screenshot gepostet, der das erwartete Verhalten zeigt, wie es mit * nix möglich ist, aber diese Robokopie scheint in keiner Hinsicht zuzulassen.
Chris Marisic
Komm schon Leute, wirklich? Darüber streiten? Ich habe die Frage aufgeräumt, um den "beleidigenden" (und geladenen) Satz zu entfernen.
Mark Henderson
-1

einfach hinzufügen \*

C:\admin\temp>robocopy "c:\Users\files\Desktop\test 2\*" "c:\Users\files\Desktop\test"  /S /MOVE
Tagas
quelle
2
Eine gute Antwort ist eine mit weiteren Erklärungen, die hier gegeben wurden.
Kasperd
es funktioniert einwandfrei und macht genau das, was op wollte. es ist auch ziemlich selbsterklärend. (Backslash allerdings irgendwie verschwunden)
Tagas
1
@Tagas: Auch wenn es gut funktioniert, sollten Sie wirklich eine Erklärung hinzufügen.
Sven