Come conservare gli attributi dei file quando si copiano i file in Windows?


41

Su Linux, possiamo semplicemente fare:

cp -pr directory

Come farlo in Windows? Può essere fatto in Esplora risorse? Qualche suggerimento sullo strumento della GUI?

Sarebbe il migliore se posso mantenere le autorizzazioni NTFS e il tempo di creazione / modifica / accesso. Come minimo, devo preservare la data di modifica per i file e le directory. La copia di Windows Explorer non conserva la data di modifica per le directory.



1
Non penso sia un duplicato. Il tempo di creazione del file è solo uno degli attributi del file.
netvope,

Le risposte a questa domanda forniscono software che conserverà tutti i timestamp, mtime, ctime e atime.
John T,

Questo potrebbe essere di interesse: support.microsoft.com/kb/310316 . Sfortunatamente alcune di queste chiavi di registro non funzionano più in Vista e verso l'alto.
Amro,

robocopy c:\folderA c:\folderB /mir /ité tutto quello di cui hai bisogno. Si noti che questo eliminerà completamente c: \ folderB e creerà un nuovo c: \ folderB che rispecchia c: \ folderA.
Pacerier,

Risposte:


6

Non esiste un modo semplice per farlo in Windows. Esistono diversi programmi che affermano di essere in grado di preservare le date di creazione dei file.
Ecco alcuni programmi che potrebbero fare il trucco http://forum.soft32.com/windows/preserve-creation-date-Copy-ftopict361820.html   (link non funzionante; non nella Wayback Machine).

Utilizzando solo Windows Explorer non è possibile. Se guardi la documentazione per la funzione CopyFile, CopyFile (winbase.h) , vedrai che evita l'oggetto. Ma la  funzione CopyFile (Windows Developer Preview) (un archivio 2012 dello stesso URL) dice:

Semantica dei tempi dei file

Questo articolo dovrebbe documentare la semantica rispetto ai tempi di creazione / modifica / accesso ai file.

Ora di creazione: se il file di destinazione esiste già, il suo 'orario di creazione viene conservato , altrimenti viene impostato sull'ora di sistema corrente.
Ora ultima modifica: sempre copiata dall'ora di modifica del file di origine.
Ora ultimo accesso: sempre impostata sull'ora di sistema corrente.


Il collegamento è interrotto.
Smile4ever,

21

RoboCopy può preservare il mtime per le directory con l'opzione / DCOPY: T, ma funziona solo in Vista e versioni successive. Può anche conservare ACL. In alternativa, FastCopy può essere configurato per preservare directory mtime, ACL e ADS .


In Windows robocopy è il modo consigliato per farlo poiché non solo copia gli attributi di file / cartella ma consente anche la corretta integrità dei file e la gestione degli errori durante l'intero processo di copia.
Megamorf

@megamorf: in che modo robocopy fa qualcosa di speciale? Non esegue alcun checksum o hashing dei dati, si affida al sistema operativo per segnalare errori proprio come quasi tutti gli altri programmi.
Afrazier

Sono d'accordo che al momento robocopy non ha alcuna funzionalità di confronto del checksum pre-post. Ma in generale, robocopy ritrasmette l'intero file quando si verifica un errore. Se si desidera che riprenda a scrivere il resto di un file nella destinazione dopo che si è verificato un errore senza trasmettere nuovamente l'intero file, si specifica l'opzione / Z.
Megamorf

@afrazier, Perché non semplicemente usare /mir?
Pacerier,

2
@Pacerier, perché la domanda non riguarda il mirroring di un albero, si tratta di copiare file e cartelle e conservare quanti più metadati possibile. Non solo /mirrimuove i dati dalla cartella di destinazione, ma era anche necessario /dcopy:tconservare i mtime delle directory e /copyallpreservare più dei semplici timestamp dei file.
Afrazier,

19

... oppure puoi semplicemente creare un archivio zip (con il metodo di compressione impostato su "Store"), e quindi decomprimere i file dove desideri copiarli. Gli attributi data / ora sono gli stessi dei file originali.


Bella idea. Ma questa copia su "le altre cose" come le proprietà dei file, ecc. Ecc.?
Pacerier,

2
Questo non funziona sempre. Con 7-zip, ad esempio, l'utilizzo della compressione 7zip non conserva uno dei tempi del file (dimentico quale). Non conserva alcun tempo di directory (come ricordo), con ZIP puoi conservare sia i tempi creati che quelli modificati, ma 7zip mantiene solo alcune volte a seconda di come decomprimi: se trascini e rilasci o estrai dal menu del programma . Prova bene, giovane cavalletta.
Jon,

3
Grazie mille, ha funzionato bene per me. Ho usato 7zip, con formato ZIP (la data di creazione non è conservata nel formato 7Z).
Dopo il

Potresti aggiungere il comando specifico che useresti per fare questo? Un esempio del comando specifico per utilizzare il metodo di compressione che hai suggerito? Questo renderebbe più una risposta completa ", al contrario di più di un suggerimento o commento. Inoltre, salverebbe innumerevoli persone dal dover effettuare una ricerca per capire come realizzare il tuo suggerimento. Inoltre, come bonus, un link a documenti o un articolo con maggiori informazioni su questo metodo sarebbe fantastico. Fornire tutte le informazioni salva tutti gli altri dal reinventare la ruota (ricerca) e può aumentare drasticamente i voti. Ti ringraziamo!
SherylHohman

6

Strumento da riga di comando Robocopy (viene fornito con la maggior parte delle versioni di Windows)
Sulla mia macchina Windows 10 si trova inC:\Windows\System32

Da Wikipedia , può essere utilizzato con il seguente set di opzioni per preservare i timestamp di file e directory, nonché altri attributi:

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

  • /DCOPY:Tpreservare i timestamp delle directory originali (richiede la versione XP026 o successiva)
  • /E: Copia le directory in modo ricorsivo, comprese le directory vuote
  • /R:0: non ritentare i file bloccati (il numero predefinito di tentativi su copie non riuscite è 1 milione),

  • /COPYALL: Copia tutte le informazioni sui file
    (equivalente a /COPY:DATSOU, dove

    • D= Dati,
    • A= attributi,
    • T= Timestamp dei file ,
    • S= Sicurezza = ACL NTFS,
    • O= Informazioni sul proprietario,
    • U= Informazioni di controllo),

Se si desidera solo conservare i timestamp di data e directory, ma non si desidera copiare sottodirectory vuote e non si desidera conservare altri attributi, è possibile utilizzare:
Robocopy C:\some_directory D:\some_directory /DCOPY:T /COPY:T /S

dove /Scopia le sottodirectory non vuote

Per visualizzare la sintassi completa, digitare robocopy /?al prompt dei comandi o dare un'occhiata a questi post del blog: https://ss64.com/nt/robocopy.html e https://techjourney.net/robocopy-syntax-command-line -switches-e-examples /

Un esempio di un comando che ho eseguito di recente:
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

Nota come l'esclusione di 2 sottodirectory richiede l' /XDutilizzo della bandiera due volte. Inoltre, la seconda esclusione di directory utilizza le virgolette perché ci sono spazi nel nome della directory.

Infine, puoi aggiungere il /Lflag per testare il comando prima di farlo sul serio. In questo modo è possibile verificare che non copi (o rimuova) eventuali directory / file che non si desidera e che non vi siano errori nel comando.

Modifica: gotcha quando si copia da una directory radice (aka unità) in una cartella (directory non root)

Dopo aver eseguito il comando di esempio sopra, la directory non era visibile! (Anche se show hidden filese show system filessono stati controllati in Windows 10!) Il seguente comando secondo https://serverfault.com/a/455029/399723 ha risolto questo problema:

attrib -h -s C:\D_backup

In alternativa, l'aggiunta di /A-:SH"ripristina l'attributo nascosto dai file di sistema", in tal modo potrebbe impedire che la directory venga nascosta in primo luogo, come da https://serverfault.com/a/565804/399723 . Vedi anche https://ss64.com/nt/robocopy.html .
Questa spiegazione getta più luce su questa opzione come soluzione.

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

Altro software:

In alternativa, è possibile scaricare una versione GUI di robocopy se non si desidera utilizzare la riga di comando.

Un'altra utility di Windows è XCopy , sebbene sia inclusa in Windows 10, è obsoleta. Vedi il link per i gotchas.

La pagina Wikipedia per RoboCopy (collegata all'inizio di questo post) elenca altri software che possono essere utilizzati.


1
Buona risposta. Dovrebbe essere il prescelto, poiché il primo è un po 'obsoleto. Ho usato robocopy da Windows 7 per tagliare le directory vuote dai backup del client, tuttavia, PENSO che fosse disponibile da Windows XP
DGoiko

@DGoiko Penso che tu abbia ragione. L'ho usato ampiamente con Windows 7 di sicuro. Sfortunatamente, l'acquisto di speciali laptop Windows 7 Pro non è più un'opzione. Quindi ora ho Win 10. Non credo di aver mai visto quando avevo XP, ma è in circolazione da molto tempo. Solo non molto conosciuto.
SherylHohman,

La GUI di Robocopy è eccellente.
Eddie Kumar

4

Sincronizzalo! 3.5 mantiene tutti i timestamp (file e cartelle, modifica e creazione). È l'unico software che conosco su Windows XP che lo fa perfettamente, accanto a Robocopy, e ne ho provati molti. Attenzione, tuttavia, può produrre file corrotti con file di origine scaricati utilizzando software come FlashGet o Orbit Downloader (i file risultanti hanno le stesse dimensioni ma in realtà vengono copiati solo 25kB, il resto è pieno di zeri). Ho chiesto al creatore del software se poteva capire perché, ma non ne aveva idea; Immagino abbia a che fare con questo software che scarica file in piccoli pacchetti (intesi a ottimizzare la velocità) e che la mia partizione di dati viene enormemente frammentata.

Robocopy XP026 è effettivamente incluso in Windows Vista, ma funziona su Windows XP. Cerca "Robocopy XP026", oppure posso inviare il file qui perché non è molto facile da trovare. Oppure puoi installare la GUI di Robocopy e quindi cercare il robocopy.exefile nella cartella System32, in modo da usarlo dalla riga di comando. Il file che ho è 208kB e il numero di versione è 5.1.2600.26.

Sembra che ci sia un bug con la "modalità di backup", tuttavia:

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

Apparentemente la versione di Robocopy XP027 non ha più questo errore ma non funziona su Windows XP.


I programmi di utilità per il download di file (come Bittorrent) allocano l'intera dimensione del file su disco (riempito con 0) e scaricano sezioni da più fonti, memorizzandole nel posto giusto nel file. I file all'avvio avranno molti 0000. O il file non è mai stato scaricato completamente o Sincronizzalo! ha visto troppi 0000 e ha rinunciato alla copia.
Chloe

Grazie! Ho usato Synchronize It! È anche così veloce! SyncToy e Unison stavano incasinando i tempi di modifica dei file. Unison stava corrompendo i collegamenti simbolici di Cygwin. SyncToy stava anche copiando "My Music" che si rivelò essere in un incrocio sulla destinazione, ma quando mi rinfrescai, continuò a voler copiare di nuovo, anche se tutto era uguale!
Chloe



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

Non sono sicuro di quale switch mantenga la data del file ma questo funziona. Quindi comprimo la directory C: \ temp \ Pics che mantiene anche le date dei file come menzionato in precedenza.


1
Come si inserisce la zip nella copia in questa discussione?
Scott,

Si adatta anche mantenendo i timestamp per i file [zippati], qualcosa che sembra occupare la persona che ha posto la domanda. Prego, Scott. Questo accade per fornire una risposta utile, se non quella corretta.
AMN

Ciò mantiene la data / ora del file, ma non lo fa per la cartella.
barneco,

1

Il modo più semplice per me, finora, è il metodo "invia a". Non ha bisogno di alcuna applicazione esterna. Nella mia esperienza, conserva tutti gli attributi del file originale.

Il metodo che ho usato prima era il metodo della cartella compressione / zip. Anche se questo richiederà sicuramente più tempo poiché i file non vengono solo copiati, ma elaborati e compressi, sia durante la compressione che la decompressione.

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

Aggiungi un collegamento alla cartella in cui desideri copiarli e l'elemento verrà visualizzato nel sendtomenu quando fai clic con il pulsante destro del mouse su un file che desideri copiare.


Grazie per aver condiviso il trucco dell'utilizzo di "Clic destro> Invia a". Funziona, tranne per la data di creazione. In precedenza, stavo usando il comando nativo xcopy: xcopy Source Destination /kes. (Il kflag consente di conservare il timestamp di modifica, ma la data di creazione non viene conservata). Il metodo di compressione per comprimere (o rar) è un buon metodo, ma spesso richiede troppo tempo.
OuzoPower,

0

È semplice spostare cartelle e directory e conservare la data di creazione. Tieni semplicemente premuto Shifte trascina la cartella nella nuova posizione (comando sposta). La data modificata sarà la data attuale, ma la data di creazione manterrà la data originale.


2
NON FARLO! Ciò elimina i file dalla cartella originale. Ho appena perso i dati irrecuperabili dal mio telefono provando a fare questo (nessun CTRL + Z non funziona).
BadAtPHP


0

xcopy funziona bene per questo. Basta specificare il flag / k per copiare gli attributi.

Sintassi
xcopy Source [Destinazione] [Parametri opzionali]

Il comando xcopy può copiare uno o più file o alberi di directory da una posizione all'altra. Il comando xcopy è incluso in tutte le versioni di Windows da Windows 95 a Windows 8.


1
Ho appena provato il /Kparametro e non ha conservato le date di creazione.
CoDEmanX

Mi sembra che funzioni a volte e talvolta no - windows al suo meglio;)
SebastianH

0

Ci riesco con

rsync -avu --modify-window = 3602 directory_origine / directory_obiettivo /

(questo è davvero usato come strumento di sincronizzazione da una directory a un altro mirror e l'opzione della finestra temporale serve a prevenire problemi quando i sistemi Windows spostano l'orologio di 1 ora per l'ora legale, ecc. rispetto ai sistemi Linux)

in ambiente cygwin all'interno di Windows o in una macchina virtuale Linux all'interno di Windows con unità Windows montate (ad es. con virtualbox)

NB cygwin e virtualbox sono entrambi gratuiti e ti consentono di avere in misura minore o maggiore funzionalità linux su Windows - entrambi richiedono un po 'di configurazione - in particolare virtualbox, ma hanno molti vantaggi ...

Il mio problema era che i file hanno l'ora corretta ma le directory no. rsync ha sistemato le date sulle directory e le date sui file.


0

Questo comando copia lo stesso timestamp per i file. Nota che non fa esattamente lo stesso timestamp per le cartelle stesse. Inoltre, ho inserito le virgolette sia intorno alla sorgente (Temp1) che alla destinazione (Temp2). Questo viene fatto nel caso in cui ci siano spazi nei percorsi. Non ho spazi ma ho pensato di includerlo per gli scenari peggiori.

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

Per mantenere gli stessi timestamp anche per le cartelle:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.