Как сохранить атрибуты файлов при копировании файлов в Windows?


41

На Linux мы можем просто сделать:

cp -pr directory

Как это сделать в Windows? Это можно сделать в проводнике Windows? Любые предложения инструмента GUI?

Было бы лучше, если бы я мог сохранить разрешения NTFS и время создания / изменения / доступа. Как минимум, мне нужно сохранить дату изменения для файлов и каталогов. Копия проводника Windows не сохраняет дату изменения для каталогов.



1
Я не думаю, что это дубликат. Время создания файла - это только один из атрибутов файла.
— нетводе

Ответы на этот вопрос предоставляют программное обеспечение, которое сохранит все метки времени, mtime, ctime и atime.
— Джон Т

Это может представлять интерес: support.microsoft.com/kb/310316 . К сожалению, некоторые из этих ключей реестра больше не работают в Vista и выше.
— Amro

robocopy c:\folderA c:\folderB /mir /itэто все, что тебе нужно. Обратите внимание, что это полностью удалит папку c: \ folderB и создаст новую папку c: \ folderB, которая отражает папку c: \ folderA.
— Pacerier

Ответы:


6

Там нет простого способа сделать это в Windows. Есть несколько программ, которые утверждают, что могут сохранять даты создания файлов.
Вот несколько программ, которые могли бы сделать трюк http://forum.soft32.com/windows/preserve-creation-date-Copy-ftopict361820.html   (Неработающая ссылка; не в Wayback Machine).

Используя только Windows Explorer, это невозможно. Если вы посмотрите документацию для CopyFile, функцию CopyFile (winbase.h) , то увидите, что она избегает темы. Но  функция CopyFile (Windows Developer Preview) (архив 2012 года с тем же URL) говорит:

Семантика времен файла

Эта статья должна документировать семантику в отношении времени создания / изменения / доступа к файлу.

Время создания: если целевой файл уже существует, время его создания сохраняется , в противном случае оно устанавливается на текущее системное время.
Время последнего изменения: всегда копируется из времени изменения исходного файла.
Время последнего доступа: всегда установлено текущее системное время.


Ссылка не работает.
— Smile4ever

21

RoboCopy может сохранить mtime для каталогов с параметром / DCOPY: T, но это работает только в Vista и новее. Это может также сохранить ACL. В качестве альтернативы FastCopy можно настроить для сохранения каталогов mtimes, ACL и ADS .


В Windows Robocopy является рекомендуемым способом сделать это, поскольку он не только копирует атрибуты файла / папки, но также обеспечивает надлежащую целостность файла и обработку ошибок в течение всего процесса копирования.
— Мегаморф

@megamorf: каким образом Robocopy делает что-то особенное? Он не выполняет никаких контрольных сумм или хэширования данных, он полагается на ОС, чтобы сообщать об ошибках, как почти любая другая программа.
— afrazier

Я согласен с тем, что в настоящее время у robocopy нет функции сравнения контрольной суммы до публикации. Но в общем случае robocopy повторно передает весь файл при возникновении ошибки. Если вы хотите возобновить запись оставшейся части файла в место назначения после того, как произошла ошибка, без повторной передачи всего файла, укажите ключ / Z.
— Мегаморф

@afrazier, почему бы просто не использовать /mir?
— Pacerier

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

19

... или вы можете просто сделать zip-архив (с методом сжатия, установленным на "Store"), а затем распаковать файлы, куда вы хотели их скопировать. Атрибуты даты / времени совпадают с исходными файлами.


Классная идея Но копирует ли это «другие вещи», такие как свойства файла и т. Д. И т. Д.?
— Pacerier

2
Это не всегда работает. Например, при использовании 7-zip сжатие 7zip не сохраняет время файла (я забыл, какой). Он не сохраняет никакого времени каталогов (насколько я помню). С ZIP вы можете сохранить как созданные, так и измененные времена, но 7zip сохраняет только некоторые времена в зависимости от того, как вы распаковываете: перетаскиваете ли вы или извлекаете из меню программы. , Испытай хорошо, молодой кузнечик.
— Джон

3
Большое спасибо, это хорошо сработало для меня. Я использовал 7zip с форматом ZIP (дата создания не сохраняется в формате 7Z).
— ПОНЯТЬ

Не могли бы вы добавить конкретную команду, которую вы бы использовали для этого? Пример конкретной команды для использования предложенного вами метода сжатия? Это сделало бы его более полным «Ответом», а не предложением или комментарием. Это также избавило бы бесчисленное количество людей от необходимости выполнять поиск, чтобы выяснить, как выполнить ваше предложение. Кроме того, в качестве бонуса, ссылка в документы или статью с более подробной информацией об этом методе было бы замечательно. Предоставление всей информации спасает всех остальных от переизобретения колеса (поиска) и может значительно увеличить количество голосов. Мы благодарим вас!
— 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 -switches-и-примеры /

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

Обратите внимание, что исключение 2 подкаталогов требует, чтобы /XDфлаг использовался дважды. Кроме того, второе исключение каталога использует кавычки, потому что в имени каталога есть пробелы.

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

Редактировать: поймал при копировании из корневого каталога (он же диск) в папку (не корневой каталог)

После запуска приведенной выше команды, каталог не был виден! (Хотя в Windows 10 show hidden filesи show system filesбыли проверены!) Следующая команда в соответствии с 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

Другое программное обеспечение:

Кроме того, вы можете загрузить версию robocopy с графическим интерфейсом, если вы не хотите использовать командную строку.

Другая утилита для Windows - это XCopy , хотя она включена в Windows 10, но она устарела. Смотрите ссылку для получения.

На странице Википедии для RoboCopy (ссылка вверху этого поста) перечислены другие программы, которые можно использовать.


1
Хороший ответ. Должен быть выбранным, так как первый устарел. Использовал robocopy начиная с Windows 7 для обрезки пустых директорий из резервных копий клиента, однако, я думаю, он был доступен начиная с Windows XP
— DGoiko

@DGoiko Я думаю, ты прав. Я использовал это широко с Windows 7 наверняка. К сожалению, покупка специальных ноутбуков с Windows 7 Pro больше не является вариантом. Итак, у меня теперь Win 10. Я не думаю, что когда-либо смотрел, когда у меня была XP, но это было давно. Просто не так хорошо известен.
— Шерил Хохман

Robocopy GUI отлично.
— Эдди Кумар

4

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

Robocopy XP026 действительно включен в Windows Vista, но работает в Windows XP. Поиск "Robocopy XP026", или я могу отправить файл здесь, так как это не очень легко найти. Или вы можете установить Robocopy GUI, а затем 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 испортили время модификации файла. Унисон испортил символические ссылки Cygwin. SyncToy даже копировал «Мою музыку», которая оказалась на перекрестке в месте назначения, но когда я обновлялся, он продолжал хотеть копировать снова, хотя все было одинаково!
— Хлоя



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

Я не уверен, какой переключатель поддерживает дату файла, но это работает. Затем я заархивирую каталог C: \ temp \ Pics, который также поддерживает даты файлов, как упоминалось ранее.


1
Как архивирование копии вписывается в это обсуждение?
— Скотт

Он также поддерживает временные метки для файлов [zip], что, кажется, занимает человека, который задал вопрос. Не за что, Скотт. Это делает полезный ответ, если не правильный.
— атп

Это сохраняет дату / время файла, но не делает это для папки.
— Барнеко

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 [Destination] [Необязательные параметры]

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


1
Я только что попробовал /Kпараметр, и он не сохранил даты создания.
— CoDEmanX

Мне кажется, что иногда это работает, а иногда нет - окна в лучшем виде;)
— SebastianH

0

Я достигаю этого с

rsync -avu --modify-window = 3602 исходный_каталог / целевой_каталог /

(это действительно используется в качестве инструмента синхронизации из одного каталога в другое зеркало, и опция временного окна - предотвращение проблем, когда системы 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.