Comment préserver les attributs de fichier quand on copie des fichiers sous Windows?

41

Sous Linux, nous pouvons simplement faire:

cp -pr directory

Comment faire ça sous Windows? Cela peut-il être fait dans l'explorateur Windows? Des suggestions d'outils d'interface graphique?

Ce serait mieux si je pouvais conserver les autorisations NTFS et le temps de création / modification / accès. Au minimum, je dois conserver la date de modification pour les fichiers et les répertoires. La copie de Windows Explorer ne conserve pas la date de modification pour les répertoires.

netvope
la source
1
Je ne pense pas que ce soit un doublon. La date de création du fichier n'est qu'un des attributs de fichier.
netvope
Les réponses à cette question fournissent un logiciel qui préservera tous les horodatages, mtime, ctime et atime.
John T
Cela peut être intéressant: support.microsoft.com/kb/310316 . Malheureusement, certaines de ces clés de registre ne fonctionnent plus à partir de Vista.
Amro
robocopy c:\folderA c:\folderB /mir /itc'est tout ce dont vous avez besoin. Notez que cela supprimera complètement c: \ folderB et créera un nouveau c: \ folderB qui reflète c: \ folderA.
Pacerier

Réponses:

6

Il n'y a pas de moyen simple de faire cela dans Windows. Plusieurs programmes prétendent pouvoir conserver les dates de création des fichiers.
Voici quelques programmes qui pourraient faire l'affaire: http://forum.soft32.com/windows/preserve-creation-date-Copy-ftopict361820.html   (lien brisé; pas dans la Wayback Machine).

En utilisant simplement Windows Explorer, ce n'est pas possible. Si vous consultez la documentation de CopyFile, Fonction CopyFile (winbase.h) , vous verrez que cela évite le sujet. Mais la  fonction CopyFile (Windows Developer Preview) (une archive 2012 de la même URL) indique:

Sémantique des temps de fichier

Cet article devrait documenter la sémantique concernant les temps de création / modification / accès de fichier.

Heure de création: si le fichier cible existe déjà, son heure de création est conservée , sinon elle est définie sur l'heure système actuelle.
Heure de dernière modification: toujours copiée à partir de l'heure de modification du fichier source.
Dernière heure d'accès: toujours régler l'heure actuelle du système.

Daisetsu
la source
Le lien est cassé.
Smile4ever
22

RoboCopy peut conserver mtime pour les répertoires dotés du commutateur / DCOPY: T, mais cela ne fonctionne que sous Vista et plus récent. Il peut également préserver les ACL. Sinon, FastCopy peut être configuré pour conserver mtimes d'annuaire, ACLs et ADSes .

afrazier
la source
Dans Windows, Robocopy est la méthode recommandée, car elle copie non seulement les attributs de fichier / dossier, mais permet également de préserver l'intégrité du fichier et de gérer les erreurs tout au long du processus de copie.
megamorf
@megamorf: De quelle manière robocopy fait-il quelque chose de spécial? Il ne fait pas de somme de contrôle ou de hachage des données, il repose sur le système d'exploitation pour signaler les erreurs comme presque n'importe quel autre programme.
Afrazier
Je conviens que pour le moment Robocopy n’a pas de fonction de comparaison de somme de contrôle pré-post. Mais en général, robocopy retransmettra l’ensemble du fichier en cas d’erreur. Si vous souhaitez qu'il reprenne l'écriture du reste d'un fichier sur la destination après qu'une erreur se soit produite sans transmettre le fichier entier à nouveau, spécifiez le commutateur / Z.
megamorf
@afrazier, pourquoi ne pas simplement utiliser /mir?
Pacerier
2
@Pacerier, parce que la question ne concerne pas la création d'une arborescence, mais la copie de fichiers et de dossiers et la préservation d'un maximum de métadonnées. Non seulement vous /mirsupprimez des données du dossier de destination, mais vous aviez également besoin /dcopy:tde conserver les noms de répertoire et /copyallde conserver plus que les horodatages de fichier.
afrazier
20

... ou vous pouvez simplement créer une archive zip (avec la méthode de compression définie sur "Stocker"), puis décompresser les fichiers où vous souhaitez les copier. Les attributs de date / heure sont les mêmes que les fichiers originaux.

Ver à soie
la source
Bonne idée. Mais cela copie-t-il "les autres éléments" comme les propriétés de fichier, etc.?
Pacerier
2
Cela ne marche pas toujours. Avec 7-zip par exemple, utiliser la compression 7zip ne préserve pas l'un des temps de fichier (j'oublie lequel). Il ne conserve pas les temps des répertoires (si je me souviens bien). Avec ZIP, vous pouvez conserver les temps créés et modifiés, mais 7zip n'en conserve que certains moments en fonction de la méthode de décompression: que vous fassiez glisser ou déposiez le menu du programme. . Testez bien, jeune sauterelle.
Jon
3
Merci beaucoup, cela a bien fonctionné pour moi. J'ai utilisé 7zip, au format ZIP (la date de création n'est pas conservée au format 7Z).
AFract le
Pourriez-vous ajouter la commande spécifique que vous utiliseriez pour cela? Un exemple de commande spécifique pour utiliser la méthode de compression que vous avez suggérée? Cela en ferait une réponse plus complète ", par opposition à une suggestion ou un commentaire. Cela éviterait également à un nombre incalculable de personnes de devoir effectuer une recherche pour déterminer comment donner suite à votre suggestion. En prime, un lien Docs ou un article avec plus d’informations sur cette méthode serait génial. Fournir toutes ces informations évite à tout le monde de réinventer la roue (de la recherche) et peut considérablement augmenter les votes. Nous vous en remercions
SherylHohman
8

Outil de ligne de commande Robocopy (fourni avec la plupart des versions de Windows)
Sur mon ordinateur Windows 10, il se trouve à l'adresseC:\Windows\System32

Sur Wikipedia , il peut être utilisé avec les options suivantes pour conserver les horodatages de fichiers et de répertoires, ainsi que d'autres attributs:

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

  • /DCOPY:Tconserver les horodatages des répertoires d' origine (nécessite la version XP026 ou ultérieure)
  • /E: Copier des répertoires de manière récursive, y compris des répertoires vides
  • /R:0: ne réessayez pas les fichiers verrouillés (le nombre de réessais sur les copies ayant échoué est défini par défaut sur 1 million),

  • /COPYALL: Copier toutes les informations du fichier,
    (équivalent à /COPY:DATSOU, où

    • D= Données,
    • A= Attributs,
    • T= Horodatage des fichiers ,
    • S= Sécurité = ACL NTFS,
    • O= Informations sur le propriétaire,
    • U= Informations d'audit),

Si vous souhaitez uniquement conserver les horodatages de date et de répertoire, mais ne souhaitez pas que les sous-répertoires vides soient copiés et que d'autres attributs ne soient pas conservés, vous pouvez utiliser:
Robocopy C:\some_directory D:\some_directory /DCOPY:T /COPY:T /S

/Scopie les sous- répertoires non vides

Pour voir la syntaxe complète, tapez robocopy /?à l'invite de commande ou consultez les articles de blog suivants: https://ss64.com/nt/robocopy.html et https://techjourney.net/robocopy-syntax-command-line -commutateurs-et-exemples /

Un exemple de commande que j'ai récemment exécuté:
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

Notez que pour exclure 2 sous-répertoires, l' /XDindicateur doit être utilisé deux fois. En outre, la deuxième exclusion de répertoire utilise des guillemets, car le nom du répertoire contient des espaces.

Enfin, vous pouvez ajouter le /Ldrapeau pour tester la commande avant de le faire réellement. De cette façon, vous pouvez vérifier qu'il ne copie pas (ou ne supprime pas) les répertoires / fichiers que vous ne voulez pas et qu'il n'y a pas d'erreur dans votre commande.

Edit: obtenu lors de la copie d'un répertoire racine (lecteur) vers un dossier (répertoire non-racine)

Après avoir exécuté l'exemple de commande ci-dessus, le répertoire n'était pas visible! (Même si show hidden fileset show system filesont été vérifiés dans Windows 10!) La commande suivante selon https://serverfault.com/a/455029/399723 a résolu ce problème:

attrib -h -s C:\D_backup

Sinon, l'ajout de /A-:SH"désactive l'attribut masqué des fichiers système" peut ainsi empêcher le répertoire de devenir caché en premier lieu, comme indiqué à l' adresse https://serverfault.com/a/565804/399723 . Voir aussi https://ss64.com/nt/robocopy.html .
Cette description apporte plus de lumière sur cette option en tant que solution.

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

Autres logiciels:

Sinon, vous pouvez télécharger une version graphique de robocopy si vous ne souhaitez pas utiliser la ligne de commande.

XCopy est un autre utilitaire Windows , bien qu’il soit inclus dans Windows 10, il est maintenant obsolète. Voir le lien pour gotchas.

La page Wikipedia de RoboCopy (liée en haut de cet article) répertorie les autres logiciels pouvant être utilisés.

SherylHohman
la source
1
Bonne réponse. Devrait être l'élu, car le premier est un peu dépassé. Robocopy utilisé depuis Windows 7 pour couper les répertoires vides des sauvegardes du client, cependant, je pense qu'il était disponible depuis Windows XP
DGoiko
@DGoiko Je pense que tu as raison. Je l'ai utilisé abondamment avec Windows 7 à coup sûr. Malheureusement, l'achat d'ordinateurs portables Windows 7 Pro spéciaux n'est plus une option. Donc, j'ai maintenant Win 10. Je ne pense pas avoir déjà regardé quand j'avais XP, mais cela fait longtemps. Juste pas si bien connu.
SherylHohman
Robocopy GUI est excellent.
Eddie Kumar
4

Synchronisez-le! La version 3.5 conserve tous les horodatages (fichiers et dossiers, modification et création). C'est le seul logiciel que je connaisse sous Windows XP qui le fasse parfaitement, à côté de Robocopy, et j'en ai essayé beaucoup. Attention, il peut produire des fichiers corrompus avec des fichiers sources téléchargés à l'aide de logiciels tels que FlashGet ou Orbit Downloader (les fichiers résultants ont la même taille, mais seuls 25 Ko sont copiés - le reste est rempli de zéros). J'ai demandé au créateur du logiciel s'il pouvait comprendre pourquoi, mais il n'avait aucune idée; Je suppose que cela a à voir avec ce logiciel qui télécharge des fichiers par petits paquets (destinés à optimiser la vitesse) et que ma partition de données est extrêmement fragmentée.

Robocopy XP026 est en effet inclus dans Windows Vista, mais fonctionne sous Windows XP. Recherchez "Robocopy XP026", ou je peux envoyer le fichier ici car ce n'est pas très facile à trouver. Ou vous pouvez installer l'interface graphique de Robocopy, puis rechercher le robocopy.exefichier dans le dossier System32 afin de l'utiliser à partir de la ligne de commande. Le fichier que j'ai est 208kB et le numéro de version est 5.1.2600.26.

Il semble y avoir un bug avec le "mode de sauvegarde", cependant:

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

La version XP027 de Robocopy n’a apparemment plus ce bogue, mais il ne fonctionne pas sous Windows XP.

Gabriel
la source
Les utilitaires de téléchargement de fichiers (comme Bittorrent) allouent la taille complète du fichier sur le disque (rempli de 0) et téléchargent des sections à partir de plusieurs sources, en les stockant au bon endroit dans le fichier. Les fichiers au démarrage auront beaucoup de 0000. Soit le fichier n’a jamais été complètement téléchargé, soit Synchronize It! vu trop de 0000 et a abandonné la copie.
Chloé
Merci! J'ai utilisé Synchronize It! C'est si rapide aussi! SyncToy et Unison dérangeaient les temps de modification des fichiers. Unison corrompait les liens symboliques Cygwin. SyncToy était même en train de copier 'My Music' qui se trouvait être à la jonction de la destination, mais lorsque je me suis rafraîchi, il a continué à vouloir copier à nouveau, même si tout était pareil!
Chloé
3

RoboCopy devrait pouvoir le faire avec le commutateur COPYALL. Vous pouvez récupérer la version graphique de Microsoft Technet .

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

Je ne sais pas quel commutateur conserve la date du fichier, mais cela fonctionne. Ensuite, je compresse le répertoire C: \ temp \ Pics qui contient également les dates de fichier mentionnées précédemment.

dmaier
la source
1
Comment compresser la copie s'inscrit dans cette discussion?
Scott
Cela convient également en maintenant les horodatages des fichiers [zippés], ce qui semble occuper la personne qui a posé la question. De rien, Scott. Cela arrive à faire une réponse utile, sinon la bonne.
amn
Cela conserve la date / heure du fichier, mais pas pour le dossier.
Barneco
1

Le moyen le plus simple pour moi jusqu’à présent est la méthode "envoyer à". Il n'a pas besoin d'applications externes. D'après mon expérience, il conserve tous les attributs de fichier d'origine.

La méthode que j'ai utilisée auparavant était la méthode du dossier compression / zip. Bien que cela prenne sûrement plus longtemps, les fichiers ne sont pas seulement copiés, mais traités et compressés, à la fois lors de la compression et de la décompression.

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

Ajoutez un raccourci au dossier où vous souhaitez les copier, et l'élément apparaît dans votre sendtomenu lorsque vous cliquez avec le bouton droit de la souris sur le fichier que vous souhaitez copier.

tspmtel
la source
Merci de partager l’astuce consistant à utiliser "Clic droit> Envoyer à". Cela fonctionne, sauf pour la date de création. Auparavant, j'utilisais la commande xcopy native: xcopy Source Destination /kes. (L’ kindicateur permet de conserver l’horodatage de la modification, mais la date de création n’est pas conservée). La méthode de compression au format zip (ou rar) est une bonne méthode, mais prend souvent trop de temps.
OuzoPower
0

Il est simple de déplacer des dossiers et des répertoires tout en préservant la date de création. Il suffit de maintenir Shiftet de faire glisser le dossier vers le nouvel emplacement (commande de déplacement). La date de modification sera la date actuelle, mais la date de création conservera la date d'origine.

Davidus428
la source
2
NE FAITES PAS CELA! Cela supprime les fichiers du dossier d'origine. Je viens de perdre des données irrécupérables de mon téléphone en essayant de le faire (aucun CTRL + Z ne fonctionne).
BadAtPHP
0

xcopy fonctionne très bien pour cela. Spécifiez simplement le drapeau / k pour copier les attributs.

Syntaxe
xcopy Source [Destination] [Paramètres facultatifs]

La commande xcopy peut copier un ou plusieurs fichiers ou arborescences de répertoires d’un emplacement à un autre. La commande xcopy est incluse dans toutes les versions de Windows de Windows 95 à Windows 8.

Chris
la source
1
Je viens d'essayer le /Kparamètre et il n'a pas préservé les dates de création.
CoDEmanX
Il me semble que cela fonctionne parfois et parfois ne fonctionne pas - fenêtres à son meilleur;)
SebastianH
0

Je réalise cela avec

rsync -avu --modify-window = 3602 répertoire_source / répertoire_cible /

(Ceci est vraiment utilisé comme outil de synchronisation d'un répertoire à un autre miroir et l'option timewindow permet d'éviter les problèmes lorsque les systèmes Windows déplacent les horloges pendant 1 heure pour passer à l'heure avancée, etc. par rapport aux systèmes Linux)

dans un environnement cygwin à l’intérieur de Windows ou dans une machine virtuelle Linux à l’intérieur de Windows avec des lecteurs Windows montés (par exemple, avec virtualbox)

NB cygwin et virtualbox sont tous deux gratuits et vous permettent d’avoir dans une moindre mesure les fonctionnalités de Linux sur Windows.

Mon propre problème était que les fichiers avaient l'heure exacte, mais pas les répertoires. rsync a trié les dates sur les répertoires ainsi que les dates sur les fichiers.

à M
la source
0

Cette commande copie le même horodatage pour les fichiers. Notez que l'horodatage des dossiers eux-mêmes n'est pas identique. Notez également que j'ai placé des guillemets autour de la source (Temp1) et de la destination (Temp2). Ceci est fait au cas où il y aurait des espaces dans les chemins. Je n'ai pas d'espace mais j'ai pensé que je devrais l'inclure pour les pires scénarios.

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

Pour que les horodatages restent identiques pour les dossiers:

copie de copie / E / copie: DAT / dcopy: DAT "C: \ Temp1" "c: \ Temp2"

pablo
la source