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

41

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

cp -pr directory

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

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

netvope
источник
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) говорит:

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

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

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

Daisetsu
источник
Ссылка не работает.
Smile4ever
21

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

afrazier
источник
В 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 (ссылка вверху этого поста) перечислены другие программы, которые можно использовать.

SherylHohman
источник
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 даже копировал «Мою музыку», которая оказалась на перекрестке в месте назначения, но когда я обновлялся, он продолжал хотеть копировать снова, хотя все было одинаково!
Хлоя
3

RoboCopy должен быть в состоянии сделать это с помощью переключателя COPYALL. Вы можете получить версию GUI от Microsoft Technet .

Расс Уоррен
источник
1
xcopy *.* C:\temp\Pics /c /d /e /h /i /k /q /r /s /x /y

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

dmaier
источник
1
Как архивирование копии вписывается в это обсуждение?
Скотт
Он также поддерживает временные метки для файлов [zip], что, кажется, занимает человека, который задал вопрос. Не за что, Скотт. Это делает полезный ответ, если не правильный.
атп
Это сохраняет дату / время файла, но не делает это для папки.
Барнеко
1

На данный момент самый простой способ для меня - это метод «отправить». Не требует никаких внешних приложений. По моему опыту, он сохраняет все исходные атрибуты файла.

Метод, который я использовал ранее, был методом сжатия / папок zip. Хотя это, безусловно, займет больше времени, поскольку файлы не только копируются, но и обрабатываются и сжимаются, как при сжатии, так и при распаковке.

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

Добавьте ярлык в папку, в которую вы хотите их скопировать, и элемент появится в вашем sendtoменю, когда вы щелкните правой кнопкой мыши файл, который хотите скопировать.

tspmtel
источник
Спасибо за то, что поделились с нами «Правой кнопкой мыши> Отправить». Работает, кроме даты создания. Раньше я использовал родную XCopy команду: xcopy Source Destination /kes. ( kФлаг позволяет сохранить метку времени модификации, но дата создания не сохраняется). Метод сжатия в zip (или rar) является хорошим методом, но часто занимает слишком много времени.
OuzoPower
0

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

Davidus428
источник
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"

Пабло
источник