Cosa fa mv in caso di errori?


18

Ho appena provato a spostare un grande albero da un disco a un altro, che era troppo piccolo. Ora, mi rimane qualcosa che non riesco davvero a capire: sembra che alcuni file siano stati effettivamente spostati dall'albero dei sorgenti mentre altri sono stati appena copiati. Questo probabilmente non è vero, e sto solo trascurando qualcosa, come ho fatto quando controllo il posto libero sul disco di destinazione. : D

Il comando era semplicemente mv source-dir destination-dir, dove entrambe le directory risiedono su dischi diversi. Sto usando mv (GNU coreutils) 7.4. Da nessuna parte nella pagina man ho trovato le risposte alle seguenti domande:

  • possono essere creati file troncati?
  • in caso di errori, verrà eliminato qualcosa nell'albero dei sorgenti?
  • come recuperare (in modo semplice e veloce)?

Risposte:


8

Penso che l'introduzione alla infopagina risponda a tutte le tue domande:

Per prima cosa usa parte dello stesso codice usato da `cp -a 'per copiare le directory e i file richiesti, quindi (supponendo che la copia sia riuscita) rimuove gli originali. Se la copia non riesce, la parte che è stata copiata nella partizione di destinazione viene rimossa. Se si dovessero copiare tre directory da una partizione all'altra e la copia della prima directory avesse esito positivo, ma la seconda no, la prima verrebbe lasciata sulla partizione di destinazione e la seconda e la terza verrebbero lasciate sulla partizione originale.

Il recupero non dovrebbe essere un problema, poiché i dati vengono conservati. Non so quanto tenti di essere atomico ( mkdirad esempio, è necessaria l'ispezione del codice sorgente) o se si trova nel suo dominio (rispetto al kernel), ma potrebbe esserci corruzione se l'interruzione si verifica quando sta già eliminando il fonte. A quel punto avresti già una buona copia nella directory di destinazione, quindi un semplice controllo della dimensione dei byte potrebbe fare il trucco.

EDIT: ho fatto alcuni test con file enormi (alcuni G) creati con dd, ma senza risultati conclusivi. Non sono mai riuscito a copiare solo alcune delle fonti - ho annullato l'intera operazione (essendo troppo veloce) o in seguito non ho avuto alcuna possibilità a causa della cache del disco e forse del buon design del filesystem (il mio ^ C è sempre atterrato dopo che lo spostamento è riuscito ).


1
Per quanto riguarda la pagina delle informazioni, capisco bene che per ogni directory di origine della riga di comando , viene rimossa se la copia corrispondente ha avuto successo? Voglio dire che mv src1 src2 dstfunziona in questo senso simile mv src1 dst; mv src2 dste ogni singolo mv src dstè come cp -a src dst && rm -rf src?
maaartinus,

1
È così che lo capisco anch'io (solo il tuo mv sarebbe mv && mv). Poiché cp -aè già ricorsivo, dubito che si applichi a singoli file e directory trovati durante l'attraversamento dell'albero. Farà alcuni test più tardi.
Lynxlynxlynx,

12

Quando mv si sta spostando su un diverso filesystem, prima copia tutti i dati sul nuovo filesystem. Una volta copiati, i nuovi dati rimuovono i vecchi dati. Ciò significa che se lo spostamento viene interrotto per errore, la posizione di origine deve contenere comunque tutti i dati.

Per quanto riguarda il recupero, solo i dati di destinazione dovrebbero essere corrotti. Invece di usare di nuovo mv, basta usare rsync e poi rm manualmente

rsync -av source-dir/ dest-dir/
rm -rf source-dir
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.