È meglio copiare ed eliminare sempre, piuttosto che spostare?


18

In generale, mi trovo nel panico quando mi rendo conto che se annullo uno spostamento di file, ciò potrebbe rendere la destinazione o la fonte incompleta. Questa domanda si applica alle piattaforme basate su Windows e Unix. Non riesco mai a ricordare esattamente come funziona il comando move in entrambi i casi. Ad esempio, se si sta spostando una directory; copia l'intera directory e quindi la elimina dopo o copia e quindi elimina ogni file singolarmente?

Mi rendo sempre conto, dopo aver digitato qualcosa del genere mv verybigdir dest, che forse avrei dovuto digitare cp -R verybigdir dest  &&  rm -R verybigdir(dove l' &&operatore procede al comando successivo solo se il primo ha avuto esito positivo) - o è inutile? Cosa succede esattamente quando premo Ctrl+ a Cmetà di una mossa? Allo stesso modo, cosa succede esattamente su Windows quando premo il pulsante Annulla?

Non riesco a contare il numero di volte in cui ho spostato qualcosa (l'ultima volta è stato durante l'utilizzo svn) e ho avuto due directory, con contenuti divisi. Immagino che la risposta sia difficile, perché non tutte le applicazioni spostano gruppi di file allo stesso modo.


16
Qualunque cosa tu faccia, non eliminare prima.
mtone,

@monotone Esilarante +1
Nick Bolton,

Risposte:


10

Su Windows, passare alla stessa unità e partizione funzionerà esattamente come il comando mv di Unix e rinominare la cartella o modificarne il genitore. Tuttavia, se dovessi spostarlo su un altro driver o partizione, copierebbe ed eliminerebbe file per file, quindi perché è più efficiente usare un file tar o un file zip senza compressione per spostare i file più velocemente tra partizioni e dischi rigidi . Se lo annullassi, semplicemente si fermerebbe dove si trova. Credo che lo stesso sia vero per Unix ma non ho sperimentato abbastanza per esserne sicuro al 100%. Si tratta solo di cambiare l'inode, ma se si trova su un'altra partizione o unità, deve essere copiato nei settori su quella partizione o unità. Se lo avessi annullato durante il trasferimento, avrebbe già spostato alcuni file e il file che veniva trasferito lo vedrà '

Aggiornamento: se dovessi annullare una mossa e volessi riprenderla, emetti nuovamente l'ordine di mossa. Potrebbe avvisarti che la cartella di destinazione esiste già, ma i file non verranno sovrascritti (a meno che non esistessero prima del trasloco originale o non fossero aggiunti tra i due ordini di spostamento) poiché non appena vengono trasferiti, vengono eliminati dal sorgente (se su un'altra partizione o unità).


Ah, non avevo pensato alla compressione.
Nick Bolton,

Non hai davvero bisogno di comprimere, il che può richiedere molto tempo. A volte un livello di compressione pari a 0 (memoria) può fare il lavoro per spostare le cartelle di grandi dimensioni tra le unità molto più velocemente.
Lupo,

"Su Windows, passare alla stessa unità e partizione funzionerà esattamente come il comando mv di Unix e rinominerà la cartella o cambierà il suo genitore." - Quando si utilizza Esplora risorse non è vero. Fa un sacco di schifezze, ci vogliono anni e potresti finire con il contenuto diviso in due directory, vedi questa risposta a una mia domanda .
maaartinus l'

@maaartinus In realtà, il modo in cui funziona Windows Explorer è che scava ricorsivamente nelle cartelle piuttosto che cambiare il nodo padre. Hai ragione però per Windows Explorer, non è solo una mossa atomica. Supponevo che la riga di comando fosse in uso, avrei dovuto chiedere.
Lupo,

11

Anche su un computer perfettamente stabile che non guasta mai: se ti preoccupi dei timestamp, allora mvè meglio che semplice cp.

( cp -aconserverò i timestamp per te e presumo che esista qualcosa di simile su Windows).


1
Ah, timestamp. Non l'avevo considerato! +1
Nick Bolton,

I timestamp sono importanti anche onestamente ...
Marcin,

1
@Marcin, sono lì per un motivo, se è quello che stai chiedendo ...
macek,

10

No.

Spiegazione:

mv verybigdir dest

rinomina verybigdir in dest. Questa è un'operazione atomica, cioè non può fallire a metà strada.

Se dest è su un altro dispositivo, mv copierà per primo, quindi eliminerà la vecchia versione. Questa non è un'operazione atomica. Se fallisce, potresti avere solo una copia parziale di verybigdir in dest, ma verybigdir sarà comunque completo.

Sì, altre applicazioni possono spostare i file in modo diverso.


2
In realtà, penso che mv su Linux copi / elimini ogni file o directory singolarmente, piuttosto che copiare l'intero albero nella destinazione, quindi eliminare l'intero albero dalla sorgente ... quindi se annulli a metà strada, finirai con un po ' file in entrambe le posizioni e nessuna delle directory sarà completa.
ruba il

3
@rob: No. Le directory sono file come qualsiasi altra e vengono trattate allo stesso modo. Il comportamento di cui stai parlando è raggiunto mv verybigdir/* dest.
dmckee,

2
Fondamentalmente, mv gestisce ogni argomento in modo "cp && rm" ... mv verybigdir/* destdivide il mv di verybigdir in molte operazioni di spostamento separate. Ricorda sempre che a differenza di Windows, un programma / strumento Linux non riesce a vedere che "*" lì, è espanso dalla shell.
Jürgen A. Erhard,

4

Su Windows copio ed elimino sempre anziché spostare. Una volta stavo spostando i file ed è qui che ho notato per la prima volta un brutto ricordo. Quando ho spostato il file si è interrotto e ho ricevuto un errore, quindi ho controllato la cartella di origine e il file era sparito, quindi ho controllato la destinazione e c'era un file corrotto. Ciò è accaduto più frequentemente con file di dimensioni maggiori e la maggior parte erano download che richiedevano ore, quindi consiglio di copiarli e quindi eliminarli. Risparmia tempo all'inizio, alla fine ti ripagherà.


3

Su unix, su mosse che non attraversano i confini del filesystem, mvnon copia i dati: aggiorna semplicemente il database degli inode in varie directory. Questo è molto più veloce rispetto cpai file di grandi dimensioni.

Inoltre, l'utilizzo mvattraverso i confini del filesystem invoca silenziosamente un meccanismo di copia ed eliminazione.

Quindi penso che dovresti preferire mv.


Riassunto.
Nick Bolton,

"un meccanismo di copia ed eliminazione" può essere interpretato come "copia ogni file, quindi eliminalo" o "copia tutti i file, quindi eliminali tutti".
j_random_hacker,

2

Almeno in Windows, spostare è semplicemente una copia ed eliminazione più automatizzata. Credo che mv sposta ogni file singolarmente, il che significa che ^ c-ing non perderà alcun file, finirai con i tuoi file divisi in due punti - a differenza di Windows Explorer, che rimuoverà tutto quando annulla.

La mia soluzione è: non muoverti mai a meno che non sia sicuro di volerlo spostare.


1

Se si utilizzano ACL sul filesystem di origine, ma non sulla destinazione, mv su Linux copierà l'origine e quindi, a causa dell'incapacità di impostare gli ACL sulla destinazione, si arresterà. Quindi finisci per avere il file su entrambi i lati. In mv non esiste alcun interruttore per impedire tale comportamento, quindi in questo caso è preferibile cp && rm.

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.