Copiare dati e cartelle su Linux con CP

Per lavorare sulla riga di comando con una delle innumerevoli distribuzioni open source basate su Linux è necessario conoscere diversi comandi Linux. Grazie a una struttura di cartelle essi permettono di navigare, modificare dati o, come nel caso del comando CP, copiare file e directory. Quest’ultimo comando, che sta per “copy”, permette di creare copie di file selezionati o di cartelle intere.

A cosa serve CP su Linux?

L’operazione di copiare file e cartelle fa parte delle basi di un qualsiasi sistema operativo e viene effettuata ogni giorno dalla maggior parte degli utenti Linux. Le copie servono per essere condivise con altre persone o per essere conservate come backup. Di norma questo strumento è una componente fissa (e installata di default) di ogni installazione Linux, a prescindere dalla distribuzione usata. CP è parte delle GNU Core Utilities (abbreviato “coreutils”), un pacchetto che comprende gli strumenti più importanti e che è a libera disposizione degli utenti.

Sintassi di Linux CP

La funzione di base di CP è semplice: copiare uno o più file nella destinazione stabilita dall’utente. A tal fine sono due le informazioni da indicare: il nome dell’oggetto e la destinazione del processo. La sintassi di CP si costruisce allo stesso modo:

cp [originale] [destinazione]

A questo scopo si naviga nella directory del file da copiare e nel comando si indica il nome del file e il percorso nel quale dovrà essere salvato il nuovo file.

cp text.txt /home/utente/cartella-di-destinazione/

In questo esempio stiamo creando un nuovo file nella cartella di destinazione che ha lo stesso nome della cartella di origine. Per copiare più file contemporaneamente, essi vanno elencati uno dopo l’altro all’interno della stessa riga di comando.

cp text1.txt text2.txt text3.txt /home/utente/cartella-di-destinazione/

Negli esempi precedenti abbiamo sempre nominato la copia come il file di origine. Tuttavia, inserendo il parametro di destinazione potete dare alla copia il nome che desiderate.

cp text.txt /home/utente/cartella-di-destinazione/text_copia.txt

Senza percorso della cartella di destinazione, la copia sarà creata con un nuovo nome di file nella stessa cartella del file di origine.

cp text1.txt text2.txt

Funzioni particolari di CP

Il comando Linux CP è in grado di svolgere altri compiti usando il campo delle opzioni:

cp [opzione(i)] [originale(i)] [destinazione]

Potete inserire i seguenti parametri (flags) nel campo per ampliare o semplificare il lavoro di copia.

Parametro Descrizione Esempio
-a Copia il file con la stessa impostazione di diritti e gli stessi metadati dell’originale. cp -a text.txt /home/utente/cartella-di-destinazione/
--archive Copia il file con la stessa impostazione di diritti e gli stessi metadati dell’originale. cp --archive text.txt /home/utente/cartella-di-destinazione/
-b Crea una copia nella cache se il file originale e la destinazione hanno lo stesso nome ma diverso contenuto. cp -b text.txt /home/utente/cartella-di-destinazione/
--backup Crea una copia nella cache se il file originale e la destinazione hanno lo stesso nome ma diverso contenuto. cp --backup text.txt /home/utente/cartella-di-destinazione/
--backup=numbered Crea una nuova copia di file numerato se l’originale e la destinazione hanno lo stesso nome di file ma contenuto diverso. cp --backup==numbered text.txt /home/utente/cartella-di-destinazione/
--backup=existing Crea una nuova copia di file numerato se l’originale e la destinazione hanno lo stesso nome di file ma contenuto diverso – e se sono già presenti backup numerati. cp --backup==existing text.txt /home/utente/cartella-di-destinazione/
-d Copia link simbolici. cp -d text.txt /home/utente/cartella-di-destinazione/
-f Forza la sovrascrittura durante la copia. cp -f text.txt /home/utente/cartella-di-destinazione//text.txt
--force Forza la sovrascrittura durante la copia. cp --force text.txt /home/utente/cartella-di-destinazione/text.txt
-i Chiede il permesso prima di sovrascrivere file omonimi. cp -i text.txt /home/utente/cartella-di-destinazione/
--interactive Chiede il permesso prima di sovrascrivere file omonimi. cp --interactive text.txt /home/utente/cartella-di-destinazione/
-l Invece di una copia crea un hardlink. cp -l text.txt /home/utente/cartella-di-destinazione/
--link Invece di una copia crea un hardlink. cp --link text.txt /home/utente/cartella-di-destinazione/
-n File esistenti non saranno mai sovrascritti. cp -n text.txt /home/utente/cartella-di-destinazione/
--no-cobbler File esistenti non saranno mai sovrascritti. cp –no-cobbler text.txt /home/utente/cartella-di-destinazione/
-p Gli attributi del file originale saranno trasmessi alla copia. cp -p text.txt text1.txt
--preserve Gli attributi del file originale saranno trasmessi alla copia. cp --preserve text.txt text1.txt
--preserve=mode Il modo del file originale sarà trasmesso alla copia. cp --preserve==mode text.txt text1.txt
--preserve=ownership I diritti di possesso del file originale saranno trasmessi alla copia. cp --preserve==ownership text.txt text1.txt
--preserve=timestamp Lo stampo temporale del file originale sarà trasmesso alla copia. cp --preserve==timestamp text.txt text1.txt
--preserve=links I link del file originale saranno trasmessi alla copia. cp --preserve==links text.txt text1.txt
--preserve=context Il contesto di sicurezza sarà trasmesso alla copia. cp --preserve==context text.txt text1.txt
--preserve=xattr Gli attributi estesi del file originale saranno trasmessi alla copia. cp --preserve==xattr text.txt text1.txt
--preserve=all Tutti gli attributi del file originale saranno trasmessi alla copia. cp --preserve==all text.txt text1.txt
-P I link simbolici saranno salvati come tali. cp -P text.txt /home/utente/cartella-di-destinazione/
--no-dereference I link simbolici saranno salvati come tali. cp --no-dereference text.txt /home/utente/cartella-di-destinazione/
-r Le directory incluse le sottodirectory saranno copiate in modo ricorsivo. cp -r /home/benutzer/originalordner/ /home/utente/cartella-di-destinazione/
-R Le directory incluse le sottodirectory saranno copiate in modo ricorsivo. cp -R /home/benutzer/originalordner/ /home/utente/cartella-di-destinazione/
--recursive Le directory incluse le sottodirectory saranno copiate in modo ricorsivo. cp --recursive /home/benutzer/originalordner/ /home/utente/cartella-di-destinazione/
-s Crea un link simbolico al file originale. cp -s text.txt /home/utente/cartella-di-destinazione/
--symbolic-link Crea un link simbolico al file originale. cp --symbolic-link text.txt /home/utente/cartella-di-destinazione/
-S Sovrascrive la copia con --backup aggiungendo un suffisso backup. cp --backup=simple -S text.txt /home/utente/cartella-di-destinazione/
--suffix=eigenes_suffix Sovrascrive la copia con --backup aggiungendo un suffisso backup con un termine proprio. cp --backup=simple –suffix=eigenes_suffix text.txt /home/utente/cartella-di-destinazione/
-u Copia il file solo se il file di destinazione è più vecchio dell’originale. cp -u text.txt /home/utente/cartella-di-destinazione/text.txt
--update Copia il file solo se il file di destinazione è più vecchio dell’originale. cp --update text.txt /home/utente/cartella-di-destinazione/text.txt
-v Dopo il processo di copia emette un avviso. cp -v text.txt text1.txt
--verbose Dopo il processo di copia emette un avviso. cp --verbose text.txt text1.txt
Consiglio

Molte delle opzioni sono anche combinabili tra loro. Per farlo scrivete i parametri nell’area iniziale del comando separati da uno spazio.

Esempi di utilizzo di CP

Dalla moltitudine di opzioni per il comando copy si riconosce già che CP in Linux non si limita a essere utilizzato meramente per copiare file e cartelle. Combinando diversi parametri tra loro porterete a termine compiti più impegnativi. I seguenti tre esempi fanno riferimento a classici scenari di utilizzo che si presentano quotidianamente a un comune utente Linux.

Backup numerato

Partiamo dal presupposto che stiate lavorando a un file e che intendiate farne un backup. Per avere una panoramica delle modifiche e lasciare aperta la possibilità di recuperare lo stato originale del file, verranno inseriti singoli file. A tal fine, utilizziamo l’opzione di backup estesa.

cp -f -v --backup=numbered text.txt text.txt

Creiamo questo backup con lo stesso nome di file nella stessa cartella. Perché ciò sia possibile, utilizziamo l’opzione ‘force’. A seguire, poiché abbiamo attivato l’opzione ‘numbered’, verranno comunque creati nuovi singoli file con nomi di file numerati. Grazie a ‘verbose’ dopo ogni copia riceverete un messaggio.

Sul terminale apparirà così:

~$ cp -v -f --backup=numbered text.txt text.txt
'text.txt' -> 'text.txt.~1~'
~$ cp -v -f --backup=numbered text.txt text.txt
'text.txt' -> 'text.txt.~2~'
~$ cp -v -f --backup=numbered text.txt text.txt
'text.txt' -> 'text.txt.~3~'
~$ ls
text.txt  text.txt.~1~  text.txt.~2~  text.txt.~3~
Consiglio

In Linux potete utilizzare il comando ls per creare un elenco che mostra file e sottocartelle esistenti nella cartella.

Classificare i file con le wildcard

Poniamo che abbiate una cartella piena dei file più disparati, tra cui immagini, documenti e applicazioni, tutti in disordine. Ora mettiamo che vogliate copiare tutte le immagini in una cartella. Invece di scrivere ogni singola immagine all’interno del comando, possiamo servirci dell’asterisco (*), da utilizzare come wildcard. Nel nostro esempio sostituiamo l’intero nome di file con un asterisco e inseriamo solo le estensioni dei file.

cp *.jpg *.png /home/utente/immagini

Con questo comando riuscite a copiare tutti i file con le estensioni JPG e PNG nella cartella immagini. Tutti gli altri formati di file saranno invece ignorati. I file originali rimangono, dato che con CP i dati vengono solamente copiati senza essere spostati.

Copiare directory

L’azione di creare copie ricorsive coinvolge una cartella e tutte le sue sottocartelle. Anche la struttura della directory viene inclusa. Il processo di copia semplice con CP, invece, non funziona in questo modo: provando a copiare una cartella senza l’opzione corrispondente, si ottiene solamente un messaggio di errore. Al suo posto si utilizza il parametro ‘-r’, (‘-recursive’ o ‘-R’).

Nel nostro esempio vogliamo creare regolarmente una copia di sicurezza inclusi contenuto e sottocartelle. Per fare in modo che in futuro non ci sia bisogno di copiare tutto di nuovo, in aggiunta utilizziamo anche la funzione‘update’.

cp -r -u /home/utente/originale/ /home/utente/backup/

Eseguendo il comando per la prima volta, all’interno della cartella di backup si crea la directory ‘originale’. Tutti i file e le sottodirectory saranno copiati al suo interno. Copiare grandi quantità file potrebbe richiedere del tempo. Infine, tramite l’opzione ‘-u’ copiate sempre solo dati modificati.

Alternative a Linux CP

Nonostante le numerose opzioni di CP, il comando è utilizzabile in versione limitata solo relativamente. Se ad esempio si desidera creare una copia e in seguito cancellarne l’originale, è necessario ricorrere a MV (move). Anche per questo comando inserite l’oggetto di origine e la directory di destinazione.

Più avanzato di CP è il comando DD, il quale permette di modificare il formato dei file durante il processo di copia. A tal fine il processo procede bit per bit. Il comando si presta per copiare interi dischi rigidi o partizioni.

Altrettanto interessante è il comando Linux PYCP: esso consente di ottenere un messaggio di progresso durante il processo di copia. Tuttavia, è necessario disporre di Python 3.5 (o più recente). Nelle versioni Ubuntu più recenti il linguaggio di programmazione è installato di default.

Anche il comando Linux SCP può risultare utile. Con Secure Copy, infatti, riuscite a trasferire file dal computer locale su un altro, o viceversa. Ciò avviene tramite SSH, pertanto si tratta di un processo criptato.

In sintesi

Grazie a Linux CP avete la possibilità di copiare file e cartelle in modo semplice e veloce. Tramite diverse opzioni si possono svolgere anche compiti più complessi. Per eseguire lavori più ridondanti, potete inserire il comando anche in script shell, così facendo potete ad esempio scrivervi uno script per un backup settimanale.

Per l’utilizzo quotidiano del terminale Linux dovreste tuttavia conoscere più comandi. Per esempio, i seguenti comandi sono indispensabili se volete semplificare il workflow:

  • Comando SED in Linux: un semplice editor di testo.
  • Comando Tail in Linux: mostra le ultime righe di un file.
  • Comando Head in Linux: mostra le prima righe di un file.
  • Comando CAT in Linux: mostra il contenuto di un file.

Abbiamo una proposta per te:
Web hosting a partire da 1 €/mese!

Dominio gratis
Certificato SSL Wildcard incluso
Assistenza clienti 24/7
A partire da 1 €/mese IVA escl. per un anno,
poi 8 €/ mese IVA escl.