Copia i file in Linux, evita la copia se i file esistono nella destinazione


32

Devo copiare una cartella / home / user da un disco rigido a un altro. Ha 100.000 file e circa 10G di dimensione.

Io uso

cp -r /origin /destination

a volte ricevo alcuni errori a causa di collegamenti interrotti, autorizzazioni e così via. Quindi correggo l'errore e devo riavviare la copia.

Mi chiedo come potrei dire al comando "cp", una volta che tenta di copiare di nuovo, di non copiare di nuovo i file se esistono nella cartella di destinazione.


2
Non ci cp. Usa invece rsync.
William Pursell,

Risposte:


22

cp -R -u -p /source /destination

Il -u( o--update ) flag fa proprio questo:

Dalla pagina man di cp:

-u, --aggiornamento

copia solo quando il file SOURCE è più recente del file di destinazione o quando manca il file di destinazione


6
Per copiare letteralmente solo file che non esistono e non aggiornare quelli esistenti, yes n | cp -i /source/* /destination 2>/dev/null
sventechie

4
-u, - aggiornare copia solo quando il file SOURCE è più recente del file di destinazione o quando manca il file di destinazione -u, --aggiornamento copia solo quando il file SOURCE è più recente del file di destinazione o quando manca il file di destinazione -p come --preserve = mode, proprietà, timestamp --preserve [= ATTR_LIST] conserva gli attributi specificati (default: mode, proprietà, timestamp), se possibile attributi aggiuntivi: contesto, collegamenti, xattr, tutti
Covich

51

Basta usare cp -n <source> <dest>.

Dalla pagina man :

-n, --no-clobber

NON sovrascrivere un file esistente (sovrascrive un'opzione -i precedente)


7
Questa è l'unica vera risposta alla domanda.
sebix,

20

rsync -aq /src /dest

Oltre a copiare solo i file più recenti, copierà anche le parti più recenti dei file solo se il file è stato modificato. È progettato per la copia su collegamenti di rete in cui si desidera ridurre al minimo la quantità di dati, ma funziona anche a livello locale.


Non riesco ad aggiungere `` formattazione al tuo post perché ha solo due caratteri. Come ti sentiresti a modificare questo e aggiungere `` caratteri attorno al tuo comando?
culix

4

Cerca l'opzione "-u" per il cpcomando.


2
Non sono d'accordo sul fatto che usare -u sia una buona idea. -u copia solo quando la fonte è più recente o manca la destinazione. Il problema del poster originale è stato causato dalla rottura della copia del file per qualsiasi motivo. OP avrebbe quindi un file scritto a metà che non è stato aggiornato durante la riesecuzione della copia. Quel file potrebbe essere importante per qualcuno! rsync risolve questo problema.
Hazymat,

2

Tutte le risposte sopra sono corrette, ma se lo stai facendo in modo ricorsivo, allora

dovresti fare:

 cp -rn SOURCE_PATH DESTINATION_PATH

1

Dovresti copiare come root per mantenere le autorizzazioni / proprietà

# cp -au

Guarda anche rsync


1

Soluzione POSIX

Altre risposte utilizzano -u o -nopzioni di cp. Nessuno di questi è richiesto da POSIX ; né rsyncproviene da un'altra risposta; né viene yesutilizzato in uno dei commenti.

Possiamo ancora riprodurre yes ncon un whileloop. Questo porta alla seguente soluzione POSIX:

while true; do echo n; done | cp -Ri /origin /destination 2>/dev/null

0

Uso cp -rn <sourcedirname>/. <destdirname>

L'opzione r rende la copia ricorsiva sulle directory.

L'opzione n (versione lunga no-clobber) assicura che i file esistenti non vengano mai sovrascritti.

Il ' /.' dopo il sourcedirname assicura che non diventi una sottodirectory sotto il destdirname invece che tutti i contenuti del primo vengano copiati nel secondo.

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.