Polecenie linii poleceń, aby skopiować cały katalog (w tym folder katalogu) do innego katalogu

68

używając wiersza poleceń, chciałbym skopiować jeden katalog do drugiego. Na przykład istnieje katalog C:/testi C:/test2.

Chciałbym skopiować C:/testdo, C:/test2aby wynik byłC:/test2/test

Wszystko znalazłem dotąd skopiuje tylko pliki i foldery zawarte w C:/testINTO C:/test2, ale pozostawia się do katalogu nadrzędnego.

Scott Chamberlain
źródło
1
spróbuj użyć xcopy

Odpowiedzi:

50

Spróbuj skorzystać XCOPYz /Eprzełącznika. Więcej informacji tutaj .

Nie miałem dostępu do tej informacji z mojego mózgu w latach !

AKTUALIZACJA

Dokumentacja mówi, że kopiuje wszystkie pliki i podkatalogi z katalogu źródłowego (co oznacza, że katalog nadrzędny nie jest tworzony), więc trzeba by utworzyć testw C:\test2pierwszym, a następnie użyć XCOPY.

vivin
źródło
2
Przełącznik „/ T” na Xcopy wykona kopię struktury katalogów i podkatalogów bez żadnych plików.
MFG,
2
Lepiej użyć, robocopy /CREATE /COPYALL /DCOPY:T src dstaby po prostu skopiować folder i puste pliki, ale zachować wszystkie znaczniki czasu i inne atrybuty.
user1016274,
2
W rzeczywistości nie zapewnia to odpowiedzi na pytanie, ponieważ folder testnadal musi zostać utworzony.
IGRACH
3
@IGRACH Myślałem, md testa potem używanie xcopybyło banalnie oczywiste.
vivin
1
Pytanie dotyczy tego, że copyfolder nie tworzy nowego folderu, a następnie kopiuje do niego zawartość.
IGRACH
35
xcopy c:\test c:\test2\test /s /e /h

Oto informacje na temat XCOPY [ 1 , 2 ]

Hastur
źródło
2
Jak przestać prosić mnie o wpisanie „D”?
YumYumYum
2
@YYYYYum: Możesz użyć przełącznika / I: „/ I Jeśli miejsce docelowe nie istnieje i kopiowanie więcej niż jednego pliku, zakłada, że ​​miejscem docelowym musi być katalog.”
Thijs Tijsma
18

Użyj ROBOCOPY, jeśli tworzysz skrypty zapasowe. xcopy zostało wycofane i prawdopodobnie zostanie wycofane z użycia w najbliższej przyszłości. robocopy może zrobić wszystko, co potrafi xcopy. Jest również bardziej elastyczny i niezawodny. Tworzenie skryptów za pomocą robocopy zapewni im ochronę na przyszłość.


  1. Użyj robocopy, aby łatwo skopiować foldery. Polecenie robocopy zastępuje polecenie xcopy. Może szybko kopiować całe foldery bez martwienia się o zdefiniowanie zawartości. Na przykład, aby skopiować całą zawartość katalogu C: \ tools do nowego folderu D: \ backup \ tools, wprowadź następujące dane:

    robocopy C:\tools D:\backup\tools /e
    

    Modyfikator / e mówi robocopy, aby zawierał wszystkie podkatalogi. Obejmuje to puste foldery. robocopy automatycznie skopiuje ukryte i systemowe pliki. Stworzy nowe katalogi, jeśli nie istnieją w docelowej lokalizacji.

  2. Utwórz kopię lustrzaną katalogu. Odbicie lustrzane katalogu doskonale nadaje się do tworzenia kopii zapasowych. Opcja kopii lustrzanej robocopy skopiuje całą zawartość ze źródła do miejsca docelowego. Następnie usunie wszystko w miejscu docelowym, które nie istnieje u źródła. Zapewnia to, że kopia zapasowa zawiera tylko najnowsze wersje plików. Na przykład, aby wykonać kopię lustrzaną C: \ Users \ My Documents do D: \ backup \ My Documents, wprowadź następujące dane: [4]

    robocopy "C:\Users\My Documents" "D:\backup\My Documents" /mir
    

    Ta funkcja zachowa wszystkie uprawnienia do oryginalnych plików.

  3. Włącz ponowne uruchamianie. Możesz włączyć możliwość ponownego uruchomienia procesu w przypadku przerwania połączenia w połowie kopii.

    robocopy "C:\Users\My Documents" "D:\backup\My Documents" /z
    
  4. Zaloguj się proces kopiowania. robocopy umożliwia utworzenie pliku dziennika. Może to pomóc w określeniu problemów lub wygenerowaniu archiwum tego, co zostało skopiowane.

    robocopy "C:\Users\My Documents" "D:\backup\My Documents" /log+:<filename>.txt
    

    Modyfikator / log + doda istniejący plik dziennika zamiast nadpisania go. Jeśli wolisz po prostu zastąpić stary plik dziennika, użyj /log:.txt.

Program-Me-Rev
źródło
8

Polecam robocopy nad xcopy , ponieważ ma dużo więcej opcji, w tym utrzymywanie znaczników czasu nienaruszone, które znajdują się niezbędne.

Robocopy należy dodać w systemie XP / 2003, ale jest to standard od wersji Vista.

Właściwie zwykle używam xxcopy , ale wersja 64-bitowa nie jest darmowa.

paradroid
źródło
1
robocopyto program Windows. Pytanie dotyczyło DOS-a.
grawity
9
@grawity: Prawdopodobieństwo, że faktycznie użyje 16-bitowego systemu DOS, jest bardzo małe w porównaniu z dużym prawdopodobieństwem wywołania CMD „DOS”, jak to jest w rzeczywistości.
paradroid
prawdziwe pytanie brzmi: czy robocopy to program Microsoft?
knocte
@knocte tak to jest
yossico
5
XCOPY SourceDrive: DestinationDrive: /S /E

Na przykład, jeśli chcesz skopiować E:dane z H:dysku na dysk (zewnętrzny dysk twardy) za pomocą wiersza polecenia lub ze środowiska poleceń xboot.

xboot:\>XCOPY E:\ "H:\BackupFolder\" /S /E
Syed Khalid Mohammed
źródło
2
/ S nie jest wymagane, gdy występuje / E. windows-commandline.com/copy-directory-command-line
Giri
3

Jeśli pierwotne pytanie jest tym, czego szukałem odpowiedzi, to ja, i oczywiście nikt powyżej, nie znalazłem jasnego rozwiązania.

To, czego szukam, to skopiowanie katalogu testowego do katalogu test2 bez konieczności ponownego wpisywania go. Coś jak

xcopy /isvy c:\test d:\test2

gdzie d:\test2\testnie istnieje przed kopią, ale później. Pozwoliłoby to zaoszczędzić na teście błędnego pisania po raz drugi na ścieżce docelowej. Powyższe polecenie skopiuje wszystkie pliki i katalogi do test2, ale nie utworzy katalogu testowego.

Jak dotąd

xcopy /isvy c:\test d:\test2\test

to naprawdę jedyny sposób, w jaki udało mi się wykonać tę pracę. Ponownie, jeśli masz problemy z pisaniem, nie ma gwarancji, że katalog źródłowy i docelowy będą pasować.

Alternatywą jest to naprawić

set mydir=test&&xcopy /isvy c:\%mydir% c:\test2\%mydir%

Spowoduje to ustawienie katalogu docelowego w mydirzmiennej, a następnie wykorzystanie tej zmiennej zarówno w ścieżce źródłowej, jak i docelowej. Jeśli źle wpiszesz zmienną, albo pojawi się błąd, albo katalog docelowy prawdopodobnie będzie miał %początek i koniec.

Dłużej pisać, ale mniej szans na uzyskanie niewłaściwych nazw. Będą zauważalne.

Rachunek
źródło
To tak naprawdę, xcopy /ievy c:\test d:\test2\testaby zachować strukturę drzewa katalogów, wystarczy set mydir=test&xcopy /isvy c:\%mydir% c:\test2\%mydir%tylko 1 & , ponieważ wynik ustawienia wartości zawsze kończy się powodzeniem.
NetwOrchestration
0
xcopy SWITCHES SOURCE DESTINATION

Gdzie SWITCHESmoże być:

  • Aby skopiować całą strukturę katalogów:

    /hiev

  • Aby zastąpić pliki w miejscu docelowym (jeśli folder docelowy już istnieje):

    /hievry

  • Aby zastąpić, a także skopiować za pomocą ACL + Attribute:

    /hievxok

Najbardziej odpowiedni do twojego przypadku:

xcopy /hievry C:\test C:\test2\test

NetwOrchestration
źródło
0

Miałem podobną sytuację, w której musiałem skopiować kilka folderów, w tym nazwy folderów, do miejsca docelowego i miałem nadzieję, że to pytanie oznaczone jako odpowiedź pomoże, ale tak naprawdę nie jest.

Po pierwsze, zdecydowanie są sytuacje, w których potrzebna byłaby ta umiejętność i natknąłem się na nią, gdy musiałem skopiować foldery z C: \ Windows \ Assembly \ GAC_MSIL. Eksplorator Windows odmawia pokazania tego folderu, więc musisz użyć wiersza polecenia.

Jeśli znasz folder GAC, wiesz, że nazwy folderów nie są trywialne i łatwo się pomylić, jeśli się pomylisz.

Dlatego wcześniejsze utworzenie katalogu nie jest tak naprawdę opcją - chyba że użyjesz skryptu - którego ostatecznie użyłem, ponieważ było to jedyne prawdziwe rozwiązanie.

Najpierw zrzuć foldery, które chcesz skopiować do pliku tymczasowego, zwykle jest to oparte na pewnym wzorze, np

dir /B policy* > Folders.txt

Następnie zapętlić wpisy na zrzucie i skopiować do miejsca docelowego. Xcopy zajmie się utworzeniem folderu, jeśli zakończysz docelowy argument odwrotnym ukośnikiem (\)

for /F "tokens=*" %%A in (Folders.txt) do xcopy /E /S %%A C:\Dest\%%A\

Umieść oba te polecenia w pliku wsadowym i uruchom.

Teraz, jeśli tylko xcopy lub robocopy ma to wbudowane.

mahendrent
źródło
0

XCOPY SourceDrive: DestinationDrive: / S / E

Noor All Safaet
źródło
Witamy w Super User! Czy możesz to wyjaśnić? (zwłaszcza /S /Eflagi)
bertieb
0

Doszłam do funkcjonalnej alternatywnej odpowiedzi na twoje pytanie.

Po pierwsze, użycie FORFILESz /Sparametrem nadaje dostęp do każdego podkatalogu C:\test.

Po drugie, za pomocą /Cparametru można uruchomić łańcuch poleceń za pomocą zmiennych natywnych, co umożliwia utworzenie identycznych katalogów w miejscu docelowym, a następnie skopiowanie do nich plików za pomocą dwóch struktur warunkowych.

Pierwsza struktura warunkowa @isdir==TRUE(pamiętaj, aby używać wielkich liter), pozwala pobierać katalogi tylko ze źródła, a następnie tworzyć je w przeznaczeniu MKDIR [path]\@relpathna końcu.

Wreszcie, drugi upewnia się, że działa tylko z plikami @isdir==FALSE, a następnie polecenie KOPIUJ po prostu wykonuje zadanie, uzyskując dostęp do wszystkich plików za pomocą polecenia FORFILES, ustawiając [path]@relpathjako miejsce docelowe, aby skopiować pliki do właśnie utworzonych katalogów.

forfiles /s /c " cmd /c ( if @isdir==TRUE mkdir C:\test\@relpath ) && ( if @isdir==FALSE copy @file C:\test2\@relpath)"

Mam nadzieję, że pomoże wszystkim tutaj.

MauGusVicen
źródło