C'è qualche differenza tra mv e {cp + rm il vecchio file} su Unix?


12
  • mv a b

  • cp a b;rm a

Queste sono due serie di dichiarazioni. C'è qualche differenza tra ciò che fanno?


1
atomicita? Non so davvero se il comando mv sia atomico, comunque.
Adriano Varoli Piazza

Sì. Perché lo chiedi?

1
Ora, mvè simile a ln+ rm, tuttavia, il primo funzionerà per gli spostamenti tra i filesystem (che poi diventa cp+ rm), mentre il secondo fallirà ln(che non supporta i collegamenti fisici tra filesystem).
Chris Jester-Young,

Ogni giorno è un giorno di scuola - per chiunque arrivi a chiedersi come superare questo comportamento predefinito è necessario il --remove-destinationpassaggio - stackoverflow.com/a/9371263/409638
robert

Risposte:


20

Supponendo che i file coinvolti si trovino sullo stesso file system, quindi mv cambia semplicemente i puntatori nel file system, mentre cp copia l'intero contenuto del file e rm cambia ancora una volta i puntatori. Quindi mv è molto più efficiente.


ma fanno esattamente la stessa cosa, giusto?
Lazer,

8
No, non lo fanno.

2
@eSKay: No. Due scenari: 1. Il target non esiste. mvrinomina semplicemente il file (stesso inode del file originale). cpcrea un nuovo inode per il nuovo file. 2. Il bersaglio esiste. mvscollega (rimuove) il file di destinazione e rinomina, in un solo passaggio. cpsovrascrive l'inode del file di destinazione.
Chris Jester-Young,

7
Inoltre, mvnon cambia mai l'autorizzazione o la proprietà. Immagina di voler spostare un file dal homedir del tuo amico al tuo homedir. Se mvlo fai, finirai con un file nel tuo homedir che appartiene al tuo amico. Non è possibile chowno chmode, a seconda delle autorizzazioni nemmeno modificare o leggerlo. Se lo fai cpseguito dal rmfile apparterrà a te e tutto andrà bene.
Ludwig Weinzierl,

9

Sì, mv ha la possibilità di essere atomico sullo stesso disco, mentre la combinazione di cp e rm non lo ha mai fatto.

Questo presuppone che mv sia implementato usando rename(), che è la chiamata che ha la garanzia. Vedi, ad esempio, questo post del newsgroup , che cita POSIX:

Questa funzione rename () è equivalente per i file regolari a quella definita dallo standard ISO C. La sua inclusione qui espande quella definizione per includere azioni sulle directory e specifica il comportamento quando il nuovo parametro nomina un file già esistente. Tale specifica richiede che l'azione della funzione sia atomica.


7

Sullo stesso file system mv modifica il riferimento alla directory, puntando allo stesso inode (dati e metadati del file) quindi:

  • è un'operazione atomica (non può essere interrotta da un'altra operazione del file di processo)
  • richiede solo una minima quantità di spazio su disco aggiuntivo (il nome aggiuntivo nella directory)
  • conserva le autorizzazioni e la proprietà dei file
  • può essere molto più veloce, a seconda della quantità di dati

Copia e rimuovi

  • non è atomico (un altro processo potrebbe interferire tra i comandi cp e rm)
  • richiede di memorizzare i dati del file due volte sul disco per un breve periodo (tra i comandi cp e rm)
  • modifica le autorizzazioni e la proprietà dei file sui valori predefiniti
  • può essere molto più lento o addirittura fallire, a seconda della quantità di dati

4

Quando l'origine e la destinazione si trovano sullo stesso volume fisico, il primo approccio è semplicemente una ridenominazione ed è molto veloce (anche se i file sono molto grandi).

cpe rmdovrà sempre caricare / archiviare tutti i dati, anche se non fossero necessari.


3

mv è essenzialmente un'operazione di "rinomina". Ciò significa che il file stesso viene lasciato nello stesso punto sul disco. Non viene eseguita alcuna operazione effettiva sul file.


2

Sì.

mv cambia semplicemente i metadati del filesystem sul file in relazione al suo nome e posizione, mentre cp crea una copia separata del file, che richiede molto più tempo in quanto deve leggere completamente il primo file e quindi scrivere il suo contenuto in un altro file


2

cp e rm sono molto più pesanti sull'uso del disco e potrebbero non funzionare per motivi di spazio su disco.


2

La differenza è che mv conserva gli attributi del file mentre cp di default non lo fa, ad esempio impostando la data di creazione sulla data corrente.

Per sovrascrivere questo valore predefinito, utilizzare "cp -p" per preservare l'ultima modifica dei dati, l'ora dell'ultimo accesso, l'ID utente e l'ID gruppo (solo se dispone delle autorizzazioni per farlo), i bit di autorizzazione dei file e il SUID e SGID bit.

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.