L'umile mv command è uno di quegli strumenti utili che trovi su ogni scatola POSIX che incontri. Il suo compito è chiaramente definito e lo fa bene:spostare un file da una posizione all'altra in un file system. Ma Linux non è altro che flessibile e ci sono altre opzioni per spostare i file. L'utilizzo di strumenti diversi può fornire piccoli vantaggi che si adattano perfettamente a un caso d'uso specifico.
Prima di allontanarti troppo da mv , dai un'occhiata ai risultati predefiniti di questo comando. Innanzitutto, crea una directory e genera alcuni file con i permessi impostati su 777:
$ mkdir example
$ touch example/{foo,bar,baz}
$ for i in example/*; do ls /bin > "${i}"; done
$ chmod 777 example/*
Probabilmente non la pensi in questo modo, ma i file esistono come voci, chiamati nodi di indice (comunemente noti come inodes ), in un filesystem. Puoi vedere quale inode occupa un file con il comando ls e il suo --inode opzione:
$ ls --inode example/foo
7476868 example/foo
Come test, sposta quel file dalla directory di esempio alla directory corrente e quindi visualizza gli attributi del file:
$ mv example/foo .
$ ls -l -G -g --inode
7476868 -rwxrwxrwx. 1 29545 Aug 2 07:28 foo
Come puoi vedere, il file originale, insieme ai permessi esistenti, è stato "spostato", ma il suo inode non è cambiato.
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
Questo è il modo in cui mv lo strumento è programmato per spostare un file:lascia l'inode invariato (a meno che il file non venga spostato su un filesystem diverso) e conservane la proprietà e le autorizzazioni.
Altri strumenti forniscono opzioni diverse.
Copia e rimuovi
Su alcuni sistemi, l'azione di spostamento è una vera azione di spostamento:i bit vengono rimossi da un punto del file system e riassegnati a un altro. Questo comportamento è in gran parte caduto in disgrazia. Le azioni di spostamento ora sono riassegnazioni di attributi (un inode ora punta a una posizione diversa nell'organizzazione del file) o fusioni di un'azione di copia seguita da un'azione di rimozione.
L'intento filosofico di questo progetto è garantire che, se una mossa fallisce, un file non viene lasciato a pezzi.
Il pc comando, a differenza di mv , crea un nuovo oggetto dati nel tuo filesystem. Ha una nuova posizione dell'inode ed è soggetto alla tua umask attiva. Puoi imitare una mossa utilizzando il cp e rm (o cestino se ce l'hai) comandi:
$ cp example/foo .
$ ls -l -G -g --inode
7476869 -rwxrwxr-x. 29545 Aug 2 11:58 foo
$ trash example/foo
Il nuovo foo il file in questo esempio ha ottenuto 775 autorizzazioni perché umask della posizione esclude specificamente i permessi di scrittura:
$ umask
0002
Per ulteriori informazioni su umask, leggi l'articolo di Alex Juarez sui permessi dei file.
Cat e rimuovi
Simile a una copia e rimuovi, usando il gatto (o tac , del resto) il comando assegna autorizzazioni diverse quando viene creato il file "spostato". Supponendo un nuovo ambiente di test senza foo nella directory corrente:
$ cat example/foo > foo
$ ls -l -G -g --inode
7476869 -rw-rw-r--. 29545 Aug 8 12:21 foo
$ trash example/foo
Questa volta, è stato creato un nuovo file senza i permessi precedenti impostati. Il risultato è interamente soggetto all'impostazione umask, che non blocca alcun bit di autorizzazione per l'utente e il gruppo (il bit eseguibile non viene concesso per i nuovi file indipendentemente da umask), ma blocca il bit di scrittura (valore due) dagli altri. Il risultato è un file con autorizzazione 664.
Risincronizzazione
La rsync command è un robusto strumento multiuso per inviare file tra host e posizioni del file system. Questo comando ha molte opzioni disponibili, inclusa la possibilità di fare in modo che la sua destinazione rispecchi la sua origine.
Puoi copiare e rimuovere un file con rsync utilizzando i --remove-source-files opzione, insieme a qualsiasi altra opzione tu scelga per eseguire la sincronizzazione (una comune e generica è --archive ):
$ rsync --archive --remove-source-files example/foo .
$ ls example
bar baz
$ ls -lGgi
7476870 -rwxrwxrwx. 1 seth users 29545 Aug 8 12:23 foo
Qui puoi vedere che l'autorizzazione e la proprietà del file sono state mantenute, il timestamp è stato aggiornato e il file di origine è stato rimosso.
Un avvertimento: Non confondere questa opzione con --elimina , che rimuove i file dalla tua destinazione directory. Uso improprio di --elimina può cancellare la maggior parte dei tuoi dati e ti consigliamo di evitare questa opzione se non in un ambiente di test.
Puoi ignorare alcune di queste impostazioni predefinite, modificando i permessi e le impostazioni di modifica:
$ rsync --chmod=666 --times \
--remove-source-files example/foo .
$ ls example
bar baz
$ ls -lGgi
7476871 -rw-rw-r--. 1 seth users 29545 Aug 8 12:55 foo
Qui viene rispettato l'umask della destinazione, quindi --chmod=666 l'opzione risulta in un file con 664 autorizzazioni.
I vantaggi vanno oltre le semplici autorizzazioni, però. La rsync Il comando ha molte opzioni utili (non ultima è il comando --exclude flag in modo da poter esentare gli oggetti da una grande operazione di spostamento) che lo rendono uno strumento più robusto del semplice mv comando. Ad esempio, per escludere tutti i file di backup durante lo spostamento di una raccolta di file:
$ rsync --chmod=666 --times \
--exclude '*~' \
--remove-source-files example/foo .
Imposta le autorizzazioni con l'installazione
L'installazione command è un comando di copia specificamente rivolto agli sviluppatori e viene invocato principalmente come parte della routine di installazione della compilazione del software. Non è molto conosciuto dagli utenti (e spesso mi chiedo perché abbia un nome così intuitivo, lasciando semplici acronimi e nomignoli per i gestori di pacchetti), ma installa è in realtà un modo utile per mettere i file dove vuoi.
Ci sono molte opzioni per l'installazione comando, incluso --backup e --confronta comando (per evitare di "aggiornare" una copia più recente di un file).
A differenza di cp e gatto , ma esattamente come mv , l'installazione comando può copiare un file preservandone il timestamp:
$ install --preserve-timestamp example/foo .
$ ls -l -G -g --inode
7476869 -rwxr-xr-x. 1 29545 Aug 2 07:28 foo
$ trash example/foo
Qui, il file è stato copiato in un nuovo inode, ma è mtime non è cambiato. Le autorizzazioni, tuttavia, sono state impostate su installazione predefinito di 755 .
Puoi utilizzare installa per impostare le autorizzazioni, il proprietario e il gruppo del file:
$ install --preserve-timestamp \
--owner=skenlon \
--group=dialout \
--mode=666 example/foo .
$ ls -li
7476869 -rw-rw-rw-. 1 skenlon dialout 29545 Aug 2 07:28 foo
$ trash example/foo
Sposta, copia e rimuovi
I file contengono dati e i file veramente importanti contengono tuo dati. Imparare a gestirli con saggezza è importante e ora hai il kit di strumenti per assicurarti che i tuoi dati vengano gestiti esattamente nel modo desiderato.
Hai un modo diverso di gestire i tuoi dati? Raccontaci le tue idee nei commenti.