Як зберегти атрибути файлів при копіюванні файлів у Windows?


41

У Linux ми можемо просто зробити:

cp -pr directory

Як це зробити в Windows? Чи можна це зробити в Windows Explorer? Будь-які пропозиції інструментів GUI?

Було б найкраще, якщо я можу зберегти дозволи NTFS та час створення та модифікації / доступу. Як мінімум, мені потрібно зберегти дату модифікації для файлів та каталогів. Копія Windows Explorer не зберігає дату модифікації каталогів.



1
Я не думаю, що це дублікат. Час створення файлу - лише один з атрибутів файлу.
netvope

Відповіді на це запитання містять програмне забезпечення, яке зберігатиме всі часові позначки, mtime, ctime та atime.
Джон Т

Це може зацікавити: support.microsoft.com/kb/310316 . На жаль, деякі з цих ключів реєстру вже не працюють у Vista та вище.
Amro

robocopy c:\folderA c:\folderB /mir /itце все, що вам потрібно. Зауважте, що це повністю видалить c: \ folderB і створить нову папку c: \, що відображає c: \ folderA.
Pacerier

Відповіді:


6

Простий спосіб зробити це в Windows. Існує кілька програм, які стверджують, що можуть зберігати дати створення файлів.
Ось декілька програм, які можуть зробити фокус http://forum.soft32.com/windows/preserve-creation-date-Copy-ftopict361820.html   (нерозривна посилання; не в машині Wayback).

Використовувати лише Windows Explorer, це неможливо. Якщо ви подивитеся на документацію для функції CopyFile, CopyFile (winbase.h) , ви побачите, що вона уникає теми. Але  функція CopyFile (Windows Developer Preview) (архів 2012 року з тією ж URL-адресою) говорить:

Семантика часу файлів

Ця стаття повинна документувати семантику щодо часу створення / модифікації / доступу до файлів.

Час створення: якщо цільовий файл вже існує, час його створення зберігається , інакше він встановлюється на поточний системний час.
Час останньої модифікації: завжди копіюється з часу модифікації вихідного файлу.
Час останнього доступу: завжди встановлюється поточний системний час.


Посилання розірвано.
Smile4ever

21

RoboCopy може зберегти mtime для каталогів з перемикачем / DCOPY: T, але це працює лише у Vista та новіших версіях. Він також може зберігати ACL. Крім того, FastCopy може бути налаштований для збереження файлів mtimes, ACL та ADSes .


У роботокопії Windows - це рекомендований спосіб зробити це, оскільки він не тільки копіює атрибути файлів / папок, але й дозволяє належну цілісність файлу та обробку помилок протягом усього процесу копіювання.
Мегаморф

@megamorf: Яким способом роботокопія робить щось особливе? Він не здійснює ніяких контрольних сум чи хешування даних, він покладається на ОС, щоб повідомляти про помилки, як і майже будь-яка інша програма.
afrazier

Я погоджуюся, що на сьогоднішній день роботокопія не має функції порівняння перед контрольною сумою перед пост. Але загалом робокопія повторно передасть весь файл, коли станеться помилка. Якщо ви хочете, щоб воно відновило запис решти файлу до місця призначення після помилки, не передаючи весь файл знову, ви вказуєте перемикач / Z.
Мегаморф

@afrazier, чому б просто не використовувати /mir?
Pacerier

2
@Pacerier, оскільки питання не в дзеркальному відображенні дерева, а в тому, щоб скопіювати файли та папки та зберегти якомога більше метаданих. Він не тільки /mirвидаляє дані з папки призначення, але вам також потрібно /dcopy:tзберегти часові позначки каталогу та /copyallзберегти більше, ніж просто часові позначки файлів.
afrazier

19

... або ви можете просто створити zip-архів (методом стиснення встановлено лише "Зберігати"), а потім розпакуйте файли, куди ви хотіли їх скопіювати. Атрибути дати / часу такі ж, як і вихідні файли.


Класна ідея. Але чи є ця копія над "іншими елементами", такими як властивості файлів і т. Д. Тощо?
Pacerier

2
Це не завжди працює. Наприклад, із 7-zip, стиснення 7zip не зберігає жодного із файлів (я забуваю, який). Він не зберігає жодного разу в каталозі (наскільки я пам’ятаю). За допомогою ZIP ви можете зберігати як створені, так і модифіковані часи, але 7zip зберігає лише частину часу залежно від того, як ви розпаковуєте: чи перетягуєте чи витягуєте чи витягуєте з меню програми . Добре випробуй, молодий коник.
Джон

3
Дуже дякую, це добре працювало для мене. Я використовував 7zip, з ZIP-форматом (дата створення не зберігається у форматі 7Z).
AFAct

Чи можете ви додати конкретну команду, яку ви використали б для цього? Приклад конкретної команди для використання запропонованого вами методу стиснення? Це зробить це більш повним відповіддю ", на відміну від більшої кількості пропозицій чи коментарів. Це також врятувало б незліченному числу людей необхідність пошуку, щоб зрозуміти, як виконати вашу пропозицію. Також, як бонус, посилання Документи або стаття з додатковою інформацією про цей метод буде приголомшливою. Надання всієї інформації врятує всіх інших від винайдення колеса (пошуку) та може різко збільшити кількість рейтингів. Дякуємо!
SherylHohman

6

Інструмент командного рядка Robocopy (постачається з більшості версій windows)
На моїй машині Windows 10 він знаходиться за адресоюC:\Windows\System32

З Вікіпедії його можна використовувати з наступним набором параметрів для збереження часових позначок файлів і каталогів, а також інших атрибутів:

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

  • /DCOPY:Tзберегти часові позначки оригінальних каталогів (потрібна версія XP026 або новіша версія)
  • /E: Копіюйте каталоги рекурсивно, включаючи порожні каталоги
  • /R:0: не намагайтеся повторно заблокувати файли (кількість повторних спроб на помилкових копіях за замовчуванням становить 1 мільйон),

  • /COPYALL: Скопіюйте всю інформацію про файл
    (еквівалентно /COPY:DATSOUде

    • D= Дані,
    • A= Атрибути,
    • T= Файлові мітки часу ,
    • S= Безпека = NTFS ACL,
    • O= Інформація про власника,
    • U= Інформація про аудит),

Якщо ви хочете лише зберегти часові позначки дати та каталогів, але не хочете копіювати порожні підкаталоги та не хочете, щоб інші атрибути зберігалися, ви можете використовувати:
Robocopy C:\some_directory D:\some_directory /DCOPY:T /COPY:T /S

куди /Sкопіюються непорожні підкаталоги

Щоб побачити повний синтаксис, введіть robocopy /?у командному рядку або перегляньте ці публікації блогу: https://ss64.com/nt/robocopy.html та https://techjourney.net/robocopy-syntax-command-line -перемикачі-і-приклади /

Приклад команди, яку я нещодавно запустив:
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

Зверніть увагу, як виключення двох підкаталогів вимагає, щоб /XDпрапор був використаний двічі. Також у другому виключенні каталогів використовуються лапки, оскільки в імені каталогу є пробіли.

Нарешті, ви можете додати /Lпрапор для тестування команди, перш ніж зробити це справді. Таким чином ви можете переконатися, що він не копіює (або видаляє) жодних каталогів / файлів, які ви не хочете, і що у вашій команді немає помилок.

Редагувати: gotcha під час копіювання з Root Directory (ака-накопичувач) у папку (некоренева директорія)

Після запуску прикладу вищевказаної команди каталог не було видно! (Навіть якщо show hidden filesі show system filesбули перевірені в Windows 10!) Наступну команду в https://serverfault.com/a/455029/399723 виправив:

attrib -h -s C:\D_backup

Крім того, додавання /A-:SH"скидання прихованого атрибуту з системних файлів", таким чином, може запобігти схованню каталогу в першу чергу, як зазначено в https://serverfault.com/a/565804/399723 . Дивіться також https://ss64.com/nt/robocopy.html .
Це обговорення прояснює цей варіант як рішення.

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

Інше програмне забезпечення:

Крім того, ви можете завантажити графічну версію робокопію, якщо ви не хочете використовувати командний рядок.

Інша утиліта Windows - XCopy , хоча вона включена у Windows 10, вона застаріла. Дивіться посилання на ґетчі.

Сторінка Вікіпедії для RoboCopy (пов’язана вгорі цієї публікації) містить перелік іншого програмного забезпечення, яке можна використовувати.


1
Гарна відповідь. Повинно бути обраним, оскільки перший вигляд є застарілим. Використовується роботокопія з Windows 7 для обрізки порожніх дирекцій із резервних копій клієнта, однак, я думаю, вона була доступна з Windows XP
DGoiko

@DGoiko Я думаю, ти маєш рацію. Я точно використовував це з Windows 7 точно. На жаль, купувати спеціальні ноутбуки Windows 7 Pro - це вже не варіант. Отже, у мене зараз Win 10. Я не думаю, що коли-небудь дивився, коли мав XP, але це вже давно. Просто Не так добре відомо.
SherylHohman

Графічний інтерфейс роботи.
Едді Кумар

4

Синхронізуйте це! 3.5 зберігає всі часові позначки (файли та папки, модифікація та створення). Це єдине програмне забезпечення, яке я знаю в Windows XP, і це робить бездоганно, крім Robocopy, і я намагався багато. Але будьте обережні, вони можуть створювати пошкоджені файли із вихідними файлами, завантаженими за допомогою програмного забезпечення, таких як FlashGet або Orbit Downloader (отримані файли мають однаковий розмір, але лише 25 КБ насправді копіюються - решта заповнюється нулями). Я запитав у творця програмного забезпечення, чи може він зрозуміти чому, але він не мав поняття; Я думаю, що це стосується завантаження файлів у невеликих пакетах (призначених для оптимізації швидкості), а мій розділ даних дуже фрагментований.

Robocopy XP026 дійсно включений у Windows Vista, але працює на Windows XP. Знайдіть "Robocopy XP026", або я можу надіслати файл сюди, оскільки це не дуже легко знайти. Або ви можете встановити графічний інтерфейс Robocopy, а потім шукати robocopy.exeфайл у папці System32, щоб використовувати його з командного рядка. Файл, який я маю, становить 208 кБ, а номер версії 5.1.2600.26.

Здається, є помилка в "режимі резервного копіювання", хоча:

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

У версії Robocopy XP027 ця помилка, мабуть, більше не має, але вона не працює в Windows XP.


Утиліти для завантаження файлів (наприклад, Bittorrent) виділяють повний розмір файлу на диску (заповнений 0) та завантажують розділи з декількох джерел, зберігаючи їх у потрібному місці у файлі. Файлів, що запускаються, буде багато 0000. Або файл ніколи не був завантажений повністю або синхронізувати його! побачив занадто багато 0000 і відмовився від копії.
Хлоя

Спасибі! Я використав Synchronize It! Це теж швидко! SyncToy та Unison зіпсували час модифікації файлів. Юнісон псував посилання на Сигвіна. SyncToy навіть копіював "Мою музику", яка виявилася у стику пункту призначення, але коли я оновився, він продовжував хотіти копіювати знову, хоча все було те саме!
Хлоя



1
xcopy *.* C:\temp\Pics /c /d /e /h /i /k /q /r /s /x /y

Я не впевнений, який перемикач підтримує дату файлу, але це працює. Потім я посилаю каталог C: \ temp \ Pics, який також підтримує дати файлів, як згадувалося раніше.


1
Як блискавка копія вписується в цю дискусію?
Скотт

Він підходить, також підтримуючи часові позначки для [zipped] файлів, що, здається, займає людину, яка задала питання. Вас вітає, Скотт. Це трапляється для отримання корисної відповіді, якщо не правильної.
amn

Це зберігає дату / час файлу, але не робить це для папки.
barneco

1

Найпростіший для мене спосіб поки що - це метод "надіслати". Для цього не потрібні зовнішні програми. На мій досвід, він зберігає всі початкові атрибути файлу.

Я використовував раніше метод - це папка стиснення / zip. Хоча це, безумовно, займе більше часу, оскільки файли не тільки копіюються, але обробляються та стискаються, як при стисненні, так і при розпакуванні.

%appdata%\Microsoft\Windows\SendTo
або. C:\Users\_______\AppData\Roaming\Microsoft\Windows\SendTo

Додайте ярлик до папки, куди потрібно скопіювати, і елемент з’явиться у вашому sendtoменю, коли ви клацнете правою кнопкою миші файл, який ви хочете скопіювати.


Дякуємо, що поділилися хитрістю використання "Клацніть правою кнопкою миші> Надіслати на". Він працює, крім дати створення. Раніше я використовував натисну команду xcopy : xcopy Source Destination /kes. ( kПрапор дозволяє зберегти часову позначку модифікації, але дата створення не збереглася). Метод стиснення на zip (або rar) є хорошим методом, але часто займає занадто багато часу.
OuzoPower

0

Переміщувати папки та каталоги досить просто, зберігаючи дату створення. Просто утримуйте Shiftта перетягніть папку на нове місце (команда переміщення). Дата Змінена буде теперішньою датою, але Дата створення збереже початкову дату.


2
НЕ РОБИ ЦЬОГО! Це видаляє файли з вихідної папки. Тільки що втратив непоправні дані з мого телефону, намагаючись це зробити (жоден CTRL + Z не працює).
BadAtPHP


0

xcopy добре працює для цього. Просто вкажіть прапор / k для копіювання атрибутів.

Синтаксис
xcopy Source [Місце призначення] [Необов’язкові параметри]

Команда xcopy може копіювати один або кілька файлів або дерев каталогів з одного місця в інше. Команда xcopy включена у всі версії Windows від Windows 95 до Windows 8.


1
Я просто спробував /Kпараметр, і він не зберігав дати створення.
CoDEmanX

Мені здається, як це працює іноді, а іноді і зовсім не - вікна в кращих випадках;)
SebastianH

0

Я досягаю цього за допомогою

rsync -avu --modify-window = 3602 source_directory / target_directory /

(це дійсно використовується як інструмент синхронізації з одного каталогу в інше дзеркало. Опція тимчасового вікна - запобігання проблемам, коли системи Windows переміщують годинник на 1 годину для економії денного світла і т. д. порівняно з системами Linux)

або в середовищі cygwin всередині Windows, або у віртуальній машині Linux всередині Windows із встановленими накопичувачами Windows (наприклад, з virtualbox)

NB cygwin і virtualbox обидва безкоштовні і дозволяють вам меншою чи більшою мірою функціонувати Linux на Windows - вони обидва потребують трохи налаштування - особливо virtualbox, але мають багато переваг ....

Моя власна проблема полягала в тому, що файли мають правильний час, але каталоги не мають. rsync сортував дати в каталогах, а також дати у файлах.


0

Ця команда копіює однакову марку часу для файлів. Зауважте, це не робить точно той же самий час, що робить маркування для самих папок. Також зауважте, що я розмістив лапки навколо джерела (Temp1) та місця призначення (Temp2). Це робиться у випадку, якщо в шляхах є пробіли. У мене немає пробілів, але я подумав, що слід включити його для найгірших сценаріїв.

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

Щоб зберегти однакові часові позначки і для папок:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.