Movimento atomico approssimativo tra i file system?


16

Devo spostare alcuni file da un filesystem all'altro sotto Ubuntu. Tuttavia, è molto importante che i file non esistano mai come file parziali o incompleti nella destinazione, almeno non con il nome file corretto.

Finora, la mia unica soluzione è quella di scrivere uno script che prende ogni file, lo copia in un nome temporaneo nella destinazione, quindi lo rinomina (che credo dovrebbe essere atomico) nella destinazione al nome del file originale e infine elimina il file di origine .

Tuttavia, la scrittura e il debug di uno script sembra eccessivo per questa attività. C'è un modo o uno strumento che lo fa già in modo nativo?


8
Sento un problema xy. Perchè ti serve?
henning - ripristina Monica il

3
@henning Ci sono molte possibili ragioni, quindi questa è una buona domanda. Ad esempio, un programma che tenta automaticamente di elaborare i file con un nome file corrispondente a una certa regex (ma non può essere temporaneamente disabilitato per motivi burocratici). O forse un sistema di backup che prende i file e li archivia su supporti durevoli ma di sola scrittura.
wizzwizz4,

1
@henning Ne ho bisogno perché ho un certo numero di cache che leggono da diversi archivi, ma uno si sta avvicinando alla capacità e deve essere rimosso dal servizio. Di conseguenza, è necessario che ogni file, se esiste in una delle posizioni, deve essere completo e intatto. Altrimenti, esiste una condizione di competizione tra un trasferimento che inizia e finisce in cui una cache potrebbe catturare (e conservare) un file incompleto.
Niels2000,

Risposte:


27

rsynccopie in nomi di file temporanei (ad es. vedi estensione dei file temporanei di Rsync e rsync - crea un file temporaneo durante il trasferimento? ) a meno che tu non usi il--inplace opzione. Li rinomina solo dopo che il file è stato trasferito correttamente. rsyncelimina anche tutti i file di destinazione che sono stati trasferiti solo parzialmente (ad es. a causa del disco pieno o di altri errori).

C'è anche un --remove-source-files un'opzione che elimina i file di origine dopo che sono stati trasferiti correttamente. Vedi la rsyncpagina man per maggiori dettagli.

Mettendo tutto insieme, potresti usare qualcosa come:

rsync -ax --remove-source-files source/ target/

Questa opzione è particolarmente utile per attività come lo spostamento di file da una coda "in entrata" o simili alla directory in cui verranno elaborati.

In alternativa, se si tratta di un mirror una tantum, utilizzare semplicemente rsyncsenza l' --remove-source-filesopzione. È possibile eliminare i file di origine in un secondo momento, se lo si desidera / è necessario.


Ho pensato che ci sarebbe stato un buon strumento per il lavoro. Grazie!
Niels2000,

@ Niels2000 Non ricordo se avessi mai usato quell'opzione rsync prima, ma quello che volevi sembrava il tipo di cosa che rsyncpotevi fare, e sapevo che trasferiva i file con un nome temporaneo (a meno che tu non lo usi --inplace), quindi ho guardato in man rsynce trovato --remove-source-files. rsyncè un buon strumento per verificare prima di tutto per qualsiasi attività di trasferimento di file.
Cas
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.