Jak zachować atrybuty plików podczas kopiowania plików w systemie Windows?

41

W systemie Linux możemy po prostu zrobić:

cp -pr directory

Jak to zrobić w systemie Windows? Czy można to zrobić w Eksploratorze Windows? Wszelkie sugestie dotyczące narzędzia GUI?

Byłoby najlepiej, gdybym mógł zachować uprawnienia NTFS i czas tworzenia / modyfikacji / dostępu. Co najmniej muszę zachować datę modyfikacji plików i katalogów. Kopia Eksploratora Windows nie zachowuje daty modyfikacji katalogów.

netvope
źródło
1
Nie sądzę, że to duplikat. Czas utworzenia pliku to tylko jeden z atrybutów pliku.
netvope
Odpowiedzi w tym pytaniu zawierają oprogramowanie, które zachowa wszystkie znaczniki czasu, mtime, ctime i atime.
John T
Może to być interesujące: support.microsoft.com/kb/310316 . Niestety niektóre z tych kluczy rejestru nie działają już w systemie Vista i nowszych wersjach.
Amro
robocopy c:\folderA c:\folderB /mir /itto wszystko czego potrzebujesz. Zauważ, że spowoduje to całkowite usunięcie c: \ folder B i utworzenie nowego c: \ folder B, który będzie odzwierciedlał c: \ folder A.
Pacerier

Odpowiedzi:

6

Nie ma prostego sposobu na zrobienie tego w systemie Windows. Istnieje kilka programów, które twierdzą, że są w stanie zachować daty utworzenia plików.
Oto kilka programów, które mogą rozwiązać ten problem http://forum.soft32.com/windows/preserve-creation-date-Copy-ftopict361820.html   (uszkodzony link; nie w Wayback Machine).

Używanie tylko Eksploratora Windows nie jest możliwe. Jeśli spojrzysz na dokumentację dotyczącą funkcji CopyFile, CopyFile (winbase.h) , zobaczysz, że omija ona temat. Ale  funkcja CopyFile (Windows Developer Preview) (archiwum 2012 tego samego adresu URL) mówi:

Semantyka czasów plików

W tym artykule należy udokumentować semantykę w odniesieniu do czasów tworzenia / modyfikacji / dostępu do plików.

Czas utworzenia: jeśli plik docelowy już istnieje, jego czas utworzenia zostanie zachowany , w przeciwnym razie zostanie ustawiony bieżący czas systemowy.
Czas ostatniej modyfikacji: zawsze kopiowany z czasu modyfikacji pliku źródłowego.
Czas ostatniego dostępu: zawsze ustawiony na bieżący czas systemowy.

Daisetsu
źródło
Link jest zepsuty.
Smile4ever
21

RoboCopy może zachować mtime dla katalogów za pomocą przełącznika / DCOPY: T, ale działa to tylko w systemie Vista i nowszych. Może także zachować listy ACL. Alternatywnie FastCopy można skonfigurować tak, aby zachowywał czasy katalogów, listy ACL i ADS .

afrazier
źródło
W Windows robocopy jest zalecanym sposobem, aby to zrobić, ponieważ nie tylko kopiuje atrybuty pliku / folderu, ale także pozwala na odpowiednią integralność pliku i obsługę błędów podczas całego procesu kopiowania.
megamorf
@megamorf: W jaki sposób robocopy robi coś specjalnego? Nie dokonuje sumowania ani mieszania danych, polega na zgłaszaniu błędów przez system operacyjny tak jak prawie jakikolwiek inny program.
afrazier
Zgadzam się, że na razie robocopy nie ma funkcji porównywania sum kontrolnych przed wysłaniem. Ale ogólnie robocopy prześle ponownie cały plik, gdy wystąpi błąd. Jeśli chcesz wznowić zapisywanie pozostałej części pliku do miejsca docelowego po wystąpieniu błędu bez ponownego przesyłania całego pliku, wybierz przełącznik / Z.
megamorf
@afrazier, dlaczego nie po prostu użyć /mir?
Pacerier
2
@Pacerier, ponieważ pytanie nie dotyczy kopii lustrzanej drzewa, dotyczy kopiowania plików i folderów oraz zachowania jak największej liczby metadanych. Nie tylko /mirusuwa dane z folderu docelowego, ale nadal potrzebujesz, /dcopy:taby zachować czasy katalogów i /copyallzachować więcej niż tylko sygnatury czasowe plików.
afrazier
19

... lub możesz po prostu utworzyć archiwum zip (z metodą kompresji ustawioną na „Store”), a następnie rozpakować pliki tam, gdzie chcesz je skopiować. Atrybuty daty / godziny są takie same jak oryginalne pliki.

Jedwabnik
źródło
Fajny pomysł. Ale czy ta kopia zastępuje „inne rzeczy”, takie jak właściwości plików itp. Itp.?
Pacerier
2
To nie zawsze działa. Na przykład w przypadku 7-zip użycie kompresji 7zip nie zachowuje jednego czasu pliku (nie pamiętam, który). Nie zachowuje żadnych czasów katalogu (o ile pamiętam), dzięki ZIP możesz zachować zarówno czasy utworzone, jak i zmodyfikowane, ale 7zip zachowuje tylko niektóre czasy w zależności od tego, jak rozpakujesz: czy przeciągasz, upuszczasz lub wypakowujesz z menu programu . Testuj dobrze, młody konik polny.
Jon
3
Dziękuję bardzo, to działało mi dobrze. Użyłem 7zip w formacie ZIP (data utworzenia nie jest zachowana w formacie 7Z).
AFract
Czy możesz dodać konkretne polecenie, którego byś użył do tego? Przykład konkretnej komendy do użycia zaproponowanej metody kompresji? Sprawiłoby to, że byłaby to bardziej kompletna odpowiedź ”, w przeciwieństwie do większej ilości sugestii lub komentarzy. Pozwoliłoby to również uratować niezliczoną liczbę osób przed przeprowadzeniem wyszukiwania, aby dowiedzieć się, jak zrealizować twoją sugestię. Dodatkowo, link do dokumentów lub artykułu zawierającego więcej informacji na temat tej metody byłby niesamowity. Podanie wszystkich tych informacji ratuje wszystkich przed ponownym wynalezieniem koła (wyszukiwania) i może radykalnie zwiększyć liczbę głosów. Dziękujemy!
SherylHohman
6

Narzędzie wiersza polecenia Robocopy (dostarczane z większością wersji systemu Windows)
Na moim komputerze z systemem Windows 10 znajduje się onC:\Windows\System32

Z Wikipedii można go używać z następującym zestawem opcji, aby zachować znaczniki czasu plików i katalogów, a także inne atrybuty:

Robocopy C:\some_directory D:\some_directory /DCOPY:T /COPYALL /E /R:0

  • /DCOPY:Tzachowaj oryginalne znaczniki czasu katalogów (wymaga wersji XP026 lub nowszej)
  • /E: Kopiuj katalogi rekurencyjnie, w tym puste katalogi
  • /R:0: nie ponawiaj prób zablokowanych plików (domyślna liczba ponownych prób nieudanych kopii wynosi 1 milion),

  • /COPYALL: Skopiuj wszystkie informacje o pliku
    (równoważne z /COPY:DATSOU, gdzie

    • D= Dane,
    • A= Atrybuty,
    • T= Znaczniki czasu pliku ,
    • S= Bezpieczeństwo = listy ACL NTFS,
    • O= Informacje o właścicielu,
    • U= Informacje kontrolne),

Jeśli chcesz zachować tylko sygnatury czasowe daty i katalogu, ale nie chcesz kopiować pustych podkatalogów i nie chcesz zachowywać innych atrybutów, możesz użyć:
Robocopy C:\some_directory D:\some_directory /DCOPY:T /COPY:T /S

gdzie /Skopiuje niepuste podkatalogi

Aby zobaczyć pełną składnię, wpisz robocopy /?w wierszu polecenia lub spójrz na następujące posty na blogu: https://ss64.com/nt/robocopy.html i https://techjourney.net/robocopy-syntax-command-line -włącza-i-przykłady /

Przykład polecenia, które ostatnio uruchomiłem:
Robocopy D:\ C:\D_backup /DCOPY:T /COPYALL /E /R:0 /ZB /ETA /TEE /V /FP /XD D:\$RECYCLE.BIN /XD "D:\System Volume Information" /LOG:C:\D_backup_robocopy.LOG /MIR

Zauważ, że wykluczenie 2 podkatalogów wymaga /XDdwukrotnego użycia flagi. Ponadto w drugim wykluczeniu katalogu używane są cudzysłowy, ponieważ w nazwie katalogu znajdują się spacje.

Na koniec możesz dodać /Lflagę, aby przetestować polecenie przed wykonaniem go naprawdę. W ten sposób możesz sprawdzić, czy nie kopiuje (ani nie usuwa) katalogów / plików, których nie chcesz, i że w poleceniu nie ma błędów.

Edycja: gotcha podczas kopiowania z katalogu głównego (zwanego też dyskiem) do folderu (katalogu innego niż root)

Po uruchomieniu powyższej przykładowej komendy katalog nie był widoczny! (Choć show hidden filesi show system filesbyły sprawdzane w systemie Windows 10!) Następujące polecenie jako za https://serverfault.com/a/455029/399723 ustaloną w ten sposób:

attrib -h -s C:\D_backup

Alternatywnie, dodanie opcji /A-:SH„usuwa ukryty atrybut z plików systemowych”, może w ten sposób zapobiec ukryciu katalogu w pierwszej kolejności, zgodnie z https://serverfault.com/a/565804/399723 . Zobacz także https://ss64.com/nt/robocopy.html .
Ta dyskusja rzuca więcej światła na tę opcję jako rozwiązanie.

Robocopy D:\ C:\D_backup /A-:SH /DCOPY:T /COPYALL /E /R:0 /ZB /ETA /TEE /V /FP /XD D:\$RECYCLE.BIN /XD "D:\System Volume Information" /LOG:C:\D_backup_robocopy.LOG /MIR

Inne oprogramowanie:

Alternatywnie możesz pobrać wersję GUI robocopy, jeśli nie chcesz używać wiersza poleceń.

Innym narzędziem systemu Windows jest XCopy , chociaż jest on zawarty w systemie Windows 10, ale jest przestarzały. Zobacz link do gotchas.

Strona Wikipedii dla RoboCopy (link na górze tego postu) zawiera listę innych programów, których można użyć.

SherylHohman
źródło
1
Dobra odpowiedź. Powinien być wybrany, ponieważ pierwszy jest trochę przestarzały. Używałem robocopy od Windows 7 do przycinania pustych directoeies z kopii zapasowych klienta, jednak MYŚLĘ, że była dostępna od Windows XP
DGoiko
@DGoiko Myślę, że masz rację. Z pewnością korzystałem z niego intensywnie w systemie Windows 7. Niestety kupowanie specjalnych laptopów z systemem Windows 7 Pro nie jest już możliwe. Mam teraz Win 10. Nie sądzę, żebym kiedykolwiek patrzył, kiedy miałem XP, ale minęło już sporo czasu. Po prostu nie tak dobrze znany.
SherylHohman
Interfejs użytkownika Robocopy jest doskonały.
Eddie Kumar
4

Synchronizuj to! 3.5 zachowuje wszystkie znaczniki czasu (pliki i foldery, modyfikacje i tworzenie). To jedyne oprogramowanie, jakie znam na Windows XP, które robi to bezbłędnie, oprócz Robocopy, i próbowałem wielu. Uważaj jednak, może generować uszkodzone pliki z plikami źródłowymi pobranymi za pomocą oprogramowania takiego jak FlashGet lub Orbit Downloader (pliki wynikowe mają ten sam rozmiar, ale w rzeczywistości kopiowane jest tylko 25kB - reszta jest wypełniona zerami). Zapytałem twórcę oprogramowania, czy może dowiedzieć się, dlaczego, ale nie miał pojęcia; Wydaje mi się, że ma to związek z tym, że oprogramowanie pobiera pliki w małych pakietach (mające na celu optymalizację prędkości), a moja partycja danych jest bardzo rozdrobniona.

Robocopy XP026 jest rzeczywiście zawarty w systemie Windows Vista, ale działa w systemie Windows XP. Wyszukaj „Robocopy XP026” lub mogę wysłać plik tutaj, ponieważ nie jest łatwo go znaleźć. Lub możesz zainstalować Robocopy GUI, a następnie wyszukać robocopy.exeplik w folderze System32, aby użyć go z wiersza poleceń. Plik, który mam, to 208kB, a numer wersji to 5.1.2600.26.

Wygląda jednak na błąd w „trybie tworzenia kopii zapasowych”:

http://msmvps.com/blogs/martinzugec/archive/2008/03/03/ugly-bug-in-robocopy-ignoring-security-on-file-level.aspx

Wersja Robocopy XP027 najwyraźniej nie ma już tego błędu, ale nie działa w systemie Windows XP.

Gabriel
źródło
Narzędzia do pobierania plików (takie jak Bittorrent) przydzielają pełny rozmiar pliku na dysku (wypełnionego 0) i pobierają sekcje z wielu źródeł, przechowując je we właściwym miejscu w pliku. Pliki po uruchomieniu będą miały wiele 0000. Albo plik nigdy nie został całkowicie pobrany, albo zsynchronizuj go! zobaczyłem za dużo 0000 i zrezygnowałem z kopii.
Chloe
Dzięki! Użyłem Synchronize It! Jest też tak szybki! SyncToy i Unison zepsuły czasy modyfikacji plików. Unison korumpował dowiązania symboliczne Cygwin. SyncToy kopiował nawet „My Music”, która okazała się być skrzyżowana z miejscem docelowym, ale kiedy się odświeżyłem, wciąż chciał kopiować od nowa, mimo że wszystko było takie samo!
Chloe
3

RoboCopy powinien móc to zrobić za pomocą przełącznika COPYALL. Możesz pobrać wersję GUI z Microsoft Technet .

Russ Warren
źródło
1
xcopy *.* C:\temp\Pics /c /d /e /h /i /k /q /r /s /x /y

Nie jestem pewien, który przełącznik utrzymuje datę pliku, ale to działa. Następnie spakuję katalog C: \ temp \ Pics, który również utrzymuje daty plików, jak wspomniano wcześniej.

dmaier
źródło
1
W jaki sposób spakowanie kopii pasuje do tej dyskusji?
Scott,
Pasuje do tego także zachowanie znaczników czasu dla plików [spakowanych], co wydaje się zajmować osobę, która zadała pytanie. Nie ma za co, Scott. Tak się składa, że ​​jest to przydatna odpowiedź, jeśli nie poprawna.
AMN
To zachowuje datę / godzinę pliku, ale nie robi tego w przypadku folderu.
barneco
1

Jak dotąd najprostszym sposobem dla mnie jest metoda „wyślij do”. Nie wymaga żadnych zewnętrznych aplikacji. Z mojego doświadczenia wynika, że ​​zachowuje wszystkie oryginalne atrybuty pliku.

Metodą, której użyłem wcześniej, była metoda kompresji / zip. Chociaż z pewnością potrwa to dłużej, ponieważ pliki są nie tylko kopiowane, ale przetwarzane i kompresowane, zarówno podczas kompresji, jak i dekompresji.

%appdata%\Microsoft\Windows\SendTo
lub. C:\Users\_______\AppData\Roaming\Microsoft\Windows\SendTo

Dodaj skrót do folderu, w którym chcesz je skopiować, a element pojawi się w sendtomenu po kliknięciu prawym przyciskiem myszy pliku, który chcesz skopiować.

tspmtel
źródło
Dziękujemy za udostępnienie sztuczki polegającej na użyciu opcji „Kliknij prawym przyciskiem myszy> Wyślij do”. Działa, z wyjątkiem daty utworzenia. Wcześniej używałem rodzimą polecenia xcopy: xcopy Source Destination /kes. ( kFlaga pozwala zachować znacznik czasu modyfikacji, ale data utworzenia nie jest zachowana). Metoda kompresji do zip (lub rar) jest dobrą metodą, ale często trwa zbyt długo.
OuzoPower
0

Przenoszenie folderów i katalogów jest proste, ale nadal zachowuje datę utworzenia. Po prostu przytrzymaj Shifti przeciągnij folder do nowej lokalizacji (polecenie przeniesienia). Data modyfikacji będzie datą bieżącą, ale data utworzenia zachowa pierwotną datę.

Davidus428
źródło
2
NIE RÓB TEGO! Spowoduje to usunięcie plików z oryginalnego folderu. Właśnie straciłem nieodwracalne dane z mojego telefonu, próbując to zrobić (żadne CTRL + Z nie działa).
BadAtPHP,
0

xcopy działa dobrze do tego. Wystarczy podać flagę / k, aby skopiować atrybuty.

Składnia
xcopy Źródło [Miejsce docelowe] [Parametry opcjonalne]

Polecenie xcopy może skopiować jeden lub więcej plików lub drzew katalogowych z jednej lokalizacji do drugiej. Polecenie xcopy jest zawarte we wszystkich wersjach systemu Windows od Windows 95 do Windows 8.

Chris
źródło
1
Właśnie wypróbowałem /Kparametr i nie zachował on dat utworzenia.
CoDEmanX
Wydaje mi się, że czasami działa, a czasami nie - okna w najlepszym wydaniu;)
SebastianH
0

Osiągam to dzięki

rsync -avu --modify-window = 3602 katalog_źródłowy / katalog_docelowy /

(jest to naprawdę używane jako narzędzie do synchronizacji z jednego katalogu do drugiego kopii lustrzanej, a opcja timewindow ma na celu zapobieganie problemom, gdy systemy Windows przesuwają zegary o 1 godzinę w celu oszczędzania światła dziennego itp. w porównaniu do systemów Linux)

w środowisku cygwin w systemie Windows lub na maszynie wirtualnej z systemem Linux w systemie Windows z zamontowanymi dyskami systemu Windows (np. z virtualbox)

NB zarówno cygwin, jak i virtualbox są bezpłatne i umożliwiają korzystanie z funkcji linux w mniejszym lub większym stopniu w systemie Windows - oba wymagają trochę konfiguracji - szczególnie virtualbox, ale mają wiele zalet ...

Mój własny problem polegał na tym, że pliki mają odpowiedni czas, ale katalogi nie. rsync uporządkował daty w katalogach oraz daty w plikach.

Tomek
źródło
0

To polecenie kopiuje ten sam znacznik czasu dla plików. Pamiętaj, że nie robi dokładnie tego samego znacznika czasu dla samych folderów. Zauważ też, że umieściłem cudzysłowy zarówno w źródle (Temp1), jak i miejscu docelowym (Temp2). Odbywa się to w przypadku spacji na ścieżkach. Nie mam spacji, ale pomyślałem, że powinienem to uwzględnić w najgorszych przypadkach.

robocopy /E /copy:DAT "C:\Temp1" "c:\Temp2"

Aby zachować te same znaczniki czasu dla folderów:

robocopy / E / copy: DAT / dcopy: DAT "C: \ Temp1" "c: \ Temp2"

pablo
źródło