Spostare file in Linux può sembrare relativamente semplice, ma ci sono più opzioni disponibili di quanto molti pensino. Questo articolo insegna ai principianti come spostare i file nella GUI e sulla riga di comando, ma spiega anche cosa sta effettivamente accadendo sotto il cofano e affronta le opzioni della riga di comando che molti utenti esperti hanno raramente esplorato.
Spostare cosa?
Prima di approfondire lo spostamento dei file, vale la pena dare un'occhiata più da vicino a ciò che accade effettivamente quando si sposta oggetti del file system. Quando un file viene creato, viene assegnato a un inode , che è un punto fisso in un file system utilizzato per l'archiviazione dei dati. Puoi cosa inode mappare su un file con il comando ls:
$ ls --inode example.txt
7344977 example.txt
Quando sposti un file, in realtà non sposti i dati da un inode all'altro, ma assegni solo all'oggetto file un nuovo nome o percorso del file. In effetti, un file mantiene le sue autorizzazioni quando viene spostato, perché lo spostamento di un file non lo cambia né lo ricrea.
Gli inode di file e directory non implicano mai ereditarietà e sono dettati dal filesystem stesso. L'assegnazione degli inode è sequenziale in base a quando è stato creato il file ed è completamente indipendente da come organizzi il tuo computer. Un file "all'interno" di una directory può avere un numero di inode inferiore rispetto alla directory principale o uno superiore. Ad esempio:
$ mkdir foo
$ mv example.txt foo
$ ls --inode
7476865 foo
$ ls --inode foo
7344977 example.txt
Quando si sposta un file da un disco rigido all'altro, tuttavia, è molto probabile che l'inode cambi. Ciò accade perché i nuovi dati devono essere scritti su un nuovo filesystem. Per questo motivo, in Linux l'atto di spostare e rinominare i file è letteralmente la stessa azione. Sia che tu sposti un file in un'altra directory o nella stessa directory con un nuovo nome, entrambe le azioni vengono eseguite dallo stesso programma sottostante.
Questo articolo è incentrato sullo spostamento di file da una directory all'altra.
Muoversi con il mouse
La GUI è uno strato di astrazione amichevole e, per la maggior parte delle persone, familiare su una complessa raccolta di dati binari. È anche il primo e più intuitivo modo per spostare file su Linux. Se sei abituato all'esperienza desktop, in senso generico, probabilmente sai già come spostare i file sul tuo disco rigido. Nel desktop GNOME, ad esempio, l'azione predefinita quando si trascina e rilascia un file da una finestra all'altra è spostare il file anziché copiarlo, quindi è probabilmente una delle azioni più intuitive sul desktop:
Il file manager Dolphin nel desktop KDE Plasma richiede automaticamente all'utente di eseguire un'azione. Tenendo premuto il Maiusc durante il trascinamento di un file forza un'azione di spostamento:
Spostarsi sulla riga di comando
Il terminale Linux
- I 7 migliori emulatori di terminale per Linux
- 10 strumenti da riga di comando per l'analisi dei dati in Linux
- Scarica ora:cheat sheet SSH
- Cheat sheet sui comandi avanzati di Linux
- Esercitazioni sulla riga di comando di Linux
Il comando della shell destinato allo spostamento di file su Linux, BSD, Illumos, Solaris e MacOS è mv . Un semplice comando con una sintassi prevedibile, mv sposta un file di origine nella destinazione specificata, ciascuna definita da un percorso file assoluto o relativo. Come accennato in precedenza, mv è un comando così comune per gli utenti POSIX che molti dei suoi modificatori aggiuntivi sono generalmente sconosciuti, quindi questo articolo porta alla tua attenzione alcuni utili modificatori, sia che tu sia nuovo o esperto.
Non tutti i mv i comandi sono stati scritti dalle stesse persone, quindi potresti avere GNU mv , BSD mv o Sun mv , a seconda del tuo sistema operativo. Le opzioni di comando differiscono da implementazione a implementazione (BSD mv non ha opzioni lunghe) quindi fai riferimento al tuo mv pagina man per vedere cosa è supportato, o installa invece la tua versione preferita (questo è il lusso dell'open source).
Spostamento di un file
Per spostare un file da una cartella all'altra con mv , ricorda la sintassi mv . Ad esempio, per spostare il file example.txt nei tuoi Documenti directory:
$ touch example.txt
$ mv example.txt ~/Documents
$ ls ~/Documents
example.txt
Proprio come quando sposti un file trascinandolo sull'icona di una cartella, questo comando non sostituisce Documenti con esempio.txt . Invece, mv rileva quei Documenti è una cartella e inserisce example.txt file in esso.
Puoi anche, comodamente, rinominare il file mentre lo sposti:
$ touch example.txt
$ mv example.txt ~/Documents/foo.txt
$ ls ~/Documents
foo.txt
Questo è importante perché ti consente di rinominare un file anche quando non vuoi spostarlo in un'altra posizione, in questo modo:
$ touch example.txt
$ mv example.txt foo2.txt
$ ls
foo2.txt
Spostare una directory
Il mv comando non differenzia un file da una directory nel modo in cui cp fa. Puoi spostare una directory o un file con la stessa sintassi:
$ touch file.txt
$ mkdir foo_directory
$ mv file.txt foo_directory
$ mv foo_directory ~/Documents
Spostare un file in modo sicuro
Se copi un file in una directory in cui esiste già un file con lo stesso nome, mv Il comando sostituisce il file di destinazione con quello che stai spostando, per impostazione predefinita. Questo comportamento è chiamato clobbering , e a volte è esattamente quello che intendi. Altre volte, non lo è.
Alcune distribuzioni alias (o potresti scriverne uno tuo) mv a mv --interactive , che richiede conferma. Alcuni no. In ogni caso, puoi utilizzare il --interattivo o -i opzione per garantire che mv chiede conferma nel caso in cui due file con lo stesso nome siano in conflitto:
$ mv --interactive example.txt ~/Documents
mv: overwrite '~/Documents/example.txt'?
Se non vuoi intervenire manualmente, usa --no-clobber o -n invece. Questo flag rifiuta silenziosamente l'azione di spostamento in caso di conflitto. In questo esempio, un file denominato example.txt esiste già in ~/Documents , quindi non viene spostato dalla directory corrente come indicato:
$ mv --no-clobber example.txt ~/Documents
$ ls
example.txt
Spostarsi con i backup
Se stai usando GNU mv , ci sono opzioni di backup che offrono un altro mezzo per muoversi in sicurezza. Per creare un backup di qualsiasi file di destinazione in conflitto, utilizza -b opzione:
$ mv -b example.txt ~/Documents
$ ls ~/Documents
example.txt example.txt~
Questo flag garantisce che mv completa l'azione di spostamento, ma protegge anche qualsiasi file preesistente nella posizione di destinazione.
Un'altra opzione di backup GNU è --backup , che accetta un argomento che definisce come viene chiamato il file di backup:
- esistente :se nella destinazione esistono già backup numerati, viene creato un backup numerato. Altrimenti, il semplice viene utilizzato lo schema.
- nessuno :non crea un backup anche se --backup è impostato. Questa opzione è utile per sostituire un mv alias che imposta l'opzione di backup.
- numerati :Aggiunge il file di destinazione con un numero.
- semplice :Aggiunge il file di destinazione con un ~ , che può essere comodamente nascosto dalla visualizzazione quotidiana con i --ignore-backups opzione per ls .
Ad esempio:
$ mv --backup=numbered example.txt ~/Documents
$ ls ~/Documents
-rw-rw-r--. 1 seth users 128 Aug 1 17:23 example.txt
-rw-rw-r--. 1 seth users 128 Aug 1 17:20 example.txt.~1~
È possibile impostare uno schema di backup predefinito con la variabile di ambiente VERSION_CONTROL. Puoi impostare variabili di ambiente nel tuo ~/.bashrc file o dinamicamente prima del tuo comando:
$ VERSION_CONTROL=numbered mv --backup example.txt ~/Documents
$ ls ~/Documents
-rw-rw-r--. 1 seth users 128 Aug 1 17:23 example.txt
-rw-rw-r--. 1 seth users 128 Aug 1 17:20 example.txt.~1~
-rw-rw-r--. 1 seth users 128 Aug 1 17:22 example.txt.~2~
Il --backup l'opzione rispetta ancora --interactive o -i opzione, quindi ti chiede ancora di sovrascrivere il file di destinazione, anche se crea un backup prima di farlo:
$ mv --backup=numbered example.txt ~/Documents
mv: overwrite '~/Documents/example.txt'? y
$ ls ~/Documents
-rw-rw-r--. 1 seth users 128 Aug 1 17:24 example.txt
-rw-rw-r--. 1 seth users 128 Aug 1 17:20 example.txt.~1~
-rw-rw-r--. 1 seth users 128 Aug 1 17:22 example.txt.~2~
-rw-rw-r--. 1 seth users 128 Aug 1 17:23 example.txt.~3~
Puoi sostituire -i con la --force o -f opzione.
$ mv --backup=numbered --force example.txt ~/Documents
$ ls ~/Documents
-rw-rw-r--. 1 seth users 128 Aug 1 17:26 example.txt
-rw-rw-r--. 1 seth users 128 Aug 1 17:20 example.txt.~1~
-rw-rw-r--. 1 seth users 128 Aug 1 17:22 example.txt.~2~
-rw-rw-r--. 1 seth users 128 Aug 1 17:24 example.txt.~3~
-rw-rw-r--. 1 seth users 128 Aug 1 17:25 example.txt.~4~
Il --backup l'opzione non è disponibile in BSD mv .
Spostamento di più file contemporaneamente
Quando si spostano più file, mv considera la directory finale denominata come destinazione:
$ mv foo bar baz ~/Documents
$ ls ~/Documents
foo bar baz
Se l'elemento finale non è una directory, mv restituisce un errore:
$ mv foo bar baz
mv: target 'baz' is not a directory
La sintassi di GNU mv è abbastanza flessibile. Se non sei in grado di fornire il mv comando con la destinazione come argomento finale, usa la --target-directory o -t opzione:
$ mv --target-directory=~/Documents foo bar baz
$ ls ~/Documents
foo bar baz
Ciò è particolarmente utile quando si costruisce mv comandi dall'output di qualche altro comando, come trova comando, xargs o GNU Parallel.
Spostamento in base a mtime
Con GNU mv , puoi definire un'azione di spostamento in base al fatto che il file spostato sia più recente del file di destinazione che andrebbe a sostituire. Questa opzione è possibile con l'--aggiornamento o -u opzione e non è disponibile in BSD mv :
$ ls -l ~/Documents
-rw-rw-r--. 1 seth users 128 Aug 1 17:32 example.txt
$ ls -l
-rw-rw-r--. 1 seth users 128 Aug 1 17:42 example.txt
$ mv --update example.txt ~/Documents
$ ls -l ~/Documents
-rw-rw-r--. 1 seth users 128 Aug 1 17:42 example.txt
$ ls -l
Questo risultato si basa esclusivamente sul tempo di modifica dei file, non su una differenza tra i due file, quindi usalo con cura. È facile ingannare mv con un semplice tocco comando:
$ cat example.txt
one
$ cat ~/Documents/example.txt
one
two
$ touch example.txt
$ mv --update example.txt ~/Documents
$ cat ~/Documents/example.txt
one
Ovviamente, questa non è la funzione di aggiornamento più intelligente disponibile, ma offre una protezione di base contro la sovrascrittura dei dati recenti.
Trasloco
Esistono più modi per spostare i dati oltre a mv comando, ma come programma predefinito per il lavoro, mv è una buona opzione universale. Ora che sai quali opzioni hai a disposizione, puoi utilizzare mv più intelligente che mai.