Per lavorare sulla riga di comando con una delle in­nu­me­re­vo­li di­stri­bu­zio­ni open source basate su Linux è ne­ces­sa­rio conoscere diversi comandi Linux. Grazie a una struttura di cartelle essi per­met­to­no di navigare, mo­di­fi­ca­re 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 se­le­zio­na­ti o di cartelle intere.

Registra il tuo dominio
  • Domain Connect gratuito per una con­fi­gu­ra­zio­ne facile del DNS
  • Cer­ti­fi­ca­to SSL Wildcard gratuito
  • Pro­te­zio­ne privacy inclusa

A cosa serve CP su Linux?

L’ope­ra­zio­ne di copiare file e cartelle fa parte delle basi di un qualsiasi sistema operativo e viene ef­fet­tua­ta ogni giorno dalla maggior parte degli utenti Linux. Le copie servono per essere condivise con altre persone o per essere con­ser­va­te come backup. Di norma questo strumento è una com­po­nen­te fissa (e in­stal­la­ta di default) di ogni in­stal­la­zio­ne Linux, a pre­scin­de­re dalla di­stri­bu­zio­ne usata. CP è parte delle GNU Core Utilities (ab­bre­via­to “coreutils”), un pacchetto che comprende gli strumenti più im­por­tan­ti e che è a libera di­spo­si­zio­ne degli utenti.

Sintassi di Linux CP

La funzione di base di CP è semplice: copiare uno o più file nella de­sti­na­zio­ne stabilita dall’utente. A tal fine sono due le in­for­ma­zio­ni da indicare: il nome dell’oggetto e la de­sti­na­zio­ne del processo. La sintassi di CP si co­strui­sce 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 de­sti­na­zio­ne che ha lo stesso nome della cartella di origine. Per copiare più file con­tem­po­ra­nea­men­te, 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 pre­ce­den­ti abbiamo sempre nominato la copia come il file di origine. Tuttavia, inserendo il parametro di de­sti­na­zio­ne potete dare alla copia il nome che de­si­de­ra­te.

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

Senza percorso della cartella di de­sti­na­zio­ne, la copia sarà creata con un nuovo nome di file nella stessa cartella del file di origine.

cp text1.txt text2.txt

Funzioni par­ti­co­la­ri 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 sem­pli­fi­ca­re il lavoro di copia.

Parametro De­scri­zio­ne Esempio
-a Copia il file con la stessa im­po­sta­zio­ne di diritti e gli stessi metadati dell’originale. cp -a text.txt /home/utente/cartella-di-de­sti­na­zio­ne/
--archive Copia il file con la stessa im­po­sta­zio­ne di diritti e gli stessi metadati dell’originale. cp --archive text.txt /home/utente/cartella-di-de­sti­na­zio­ne/
-b Crea una copia nella cache se il file originale e la de­sti­na­zio­ne hanno lo stesso nome ma diverso contenuto. cp -b text.txt /home/utente/cartella-di-de­sti­na­zio­ne/
--backup Crea una copia nella cache se il file originale e la de­sti­na­zio­ne hanno lo stesso nome ma diverso contenuto. cp --backup text.txt /home/utente/cartella-di-de­sti­na­zio­ne/
--backup=numbered Crea una nuova copia di file numerato se l’originale e la de­sti­na­zio­ne hanno lo stesso nome di file ma contenuto diverso. cp --backup==numbered text.txt /home/utente/cartella-di-de­sti­na­zio­ne/
--backup=existing Crea una nuova copia di file numerato se l’originale e la de­sti­na­zio­ne 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-de­sti­na­zio­ne/
-d Copia link simbolici. cp -d text.txt /home/utente/cartella-di-de­sti­na­zio­ne/
-f Forza la so­vra­scrit­tu­ra durante la copia. cp -f text.txt /home/utente/cartella-di-de­sti­na­zio­ne//text.txt
--force Forza la so­vra­scrit­tu­ra durante la copia. cp --force text.txt /home/utente/cartella-di-de­sti­na­zio­ne/text.txt
-i Chiede il permesso prima di so­vra­scri­ve­re file omonimi. cp -i text.txt /home/utente/cartella-di-de­sti­na­zio­ne/
--in­te­rac­ti­ve Chiede il permesso prima di so­vra­scri­ve­re file omonimi. cp --in­te­rac­ti­ve text.txt /home/utente/cartella-di-de­sti­na­zio­ne/
-l Invece di una copia crea un hardlink. cp -l text.txt /home/utente/cartella-di-de­sti­na­zio­ne/
--link Invece di una copia crea un hardlink. cp --link text.txt /home/utente/cartella-di-de­sti­na­zio­ne/
-n File esistenti non saranno mai so­vra­scrit­ti. cp -n text.txt /home/utente/cartella-di-de­sti­na­zio­ne/
--no-cobbler File esistenti non saranno mai so­vra­scrit­ti. cp –no-cobbler text.txt /home/utente/cartella-di-de­sti­na­zio­ne/
-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-de­sti­na­zio­ne/
--no-de­re­fe­ren­ce I link simbolici saranno salvati come tali. cp --no-de­re­fe­ren­ce text.txt /home/utente/cartella-di-de­sti­na­zio­ne/
-r Le directory incluse le sot­to­di­rec­to­ry saranno copiate in modo ricorsivo. cp -r /home/benutzer/ori­gi­na­lord­ner/ /home/utente/cartella-di-de­sti­na­zio­ne/
-R Le directory incluse le sot­to­di­rec­to­ry saranno copiate in modo ricorsivo. cp -R /home/benutzer/ori­gi­na­lord­ner/ /home/utente/cartella-di-de­sti­na­zio­ne/
--recursive Le directory incluse le sot­to­di­rec­to­ry saranno copiate in modo ricorsivo. cp --recursive /home/benutzer/ori­gi­na­lord­ner/ /home/utente/cartella-di-de­sti­na­zio­ne/
-s Crea un link simbolico al file originale. cp -s text.txt /home/utente/cartella-di-de­sti­na­zio­ne/
--symbolic-link Crea un link simbolico al file originale. cp --symbolic-link text.txt /home/utente/cartella-di-de­sti­na­zio­ne/
-S So­vra­scri­ve la copia con --backup ag­giun­gen­do un suffisso backup. cp --backup=simple -S text.txt /home/utente/cartella-di-de­sti­na­zio­ne/
--suffix=eigenes_suffix So­vra­scri­ve la copia con --backup ag­giun­gen­do un suffisso backup con un termine proprio. cp --backup=simple –suffix=eigenes_suffix text.txt /home/utente/cartella-di-de­sti­na­zio­ne/
-u Copia il file solo se il file di de­sti­na­zio­ne è più vecchio dell’originale. cp -u text.txt /home/utente/cartella-di-de­sti­na­zio­ne/text.txt
--update Copia il file solo se il file di de­sti­na­zio­ne è più vecchio dell’originale. cp --update text.txt /home/utente/cartella-di-de­sti­na­zio­ne/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 com­bi­na­bi­li tra loro. Per farlo scrivete i parametri nell’area iniziale del comando separati da uno spazio.

Esempi di utilizzo di CP

Dalla mol­ti­tu­di­ne di opzioni per il comando copy si riconosce già che CP in Linux non si limita a essere uti­liz­za­to meramente per copiare file e cartelle. Com­bi­nan­do diversi parametri tra loro porterete a termine compiti più im­pe­gna­ti­vi. I seguenti tre esempi fanno ri­fe­ri­men­to a classici scenari di utilizzo che si pre­sen­ta­no quo­ti­dia­na­men­te a un comune utente Linux.

Backup numerato

Partiamo dal pre­sup­po­sto che stiate lavorando a un file e che in­ten­dia­te farne un backup. Per avere una pa­no­ra­mi­ca delle modifiche e lasciare aperta la pos­si­bi­li­tà di re­cu­pe­ra­re lo stato originale del file, verranno inseriti singoli file. A tal fine, uti­liz­zia­mo 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, uti­liz­zia­mo 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 ri­ce­ve­re­te 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 uti­liz­za­re il comando ls per creare un elenco che mostra file e sot­to­car­tel­le esistenti nella cartella.

Clas­si­fi­ca­re i file con le wildcard

Poniamo che abbiate una cartella piena dei file più disparati, tra cui immagini, documenti e ap­pli­ca­zio­ni, 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 uti­liz­za­re come wildcard. Nel nostro esempio so­sti­tuia­mo l’intero nome di file con un asterisco e inseriamo solo le esten­sio­ni dei file.

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

Con questo comando riuscite a copiare tutti i file con le esten­sio­ni 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 sot­to­car­tel­le. 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 cor­ri­spon­den­te, si ottiene solamente un messaggio di errore. Al suo posto si utilizza il parametro ‘-r’, (‘-recursive’ o ‘-R’).

Nel nostro esempio vogliamo creare re­go­lar­men­te una copia di sicurezza inclusi contenuto e sot­to­car­tel­le. Per fare in modo che in futuro non ci sia bisogno di copiare tutto di nuovo, in aggiunta uti­liz­zia­mo 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 sot­to­di­rec­to­ry saranno copiati al suo interno. Copiare grandi quantità file potrebbe ri­chie­de­re del tempo. Infine, tramite l’opzione ‘-u’ copiate sempre solo dati mo­di­fi­ca­ti.

Al­ter­na­ti­ve a Linux CP

No­no­stan­te le numerose opzioni di CP, il comando è uti­liz­za­bi­le in versione limitata solo re­la­ti­va­men­te. Se ad esempio si desidera creare una copia e in seguito can­cel­lar­ne l’originale, è ne­ces­sa­rio ricorrere a MV (move). Anche per questo comando inserite l’oggetto di origine e la directory di de­sti­na­zio­ne.

Più avanzato di CP è il comando DD, il quale permette di mo­di­fi­ca­re 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 par­ti­zio­ni.

Al­tret­tan­to in­te­res­san­te è il comando Linux PYCP: esso consente di ottenere un messaggio di progresso durante il processo di copia. Tuttavia, è ne­ces­sa­rio disporre di Python 3.5 (o più recente). Nelle versioni Ubuntu più recenti il lin­guag­gio di pro­gram­ma­zio­ne è in­stal­la­to di default.

Anche il comando Linux SCP può risultare utile. Con Secure Copy, infatti, riuscite a tra­sfe­ri­re 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 pos­si­bi­li­tà di copiare file e cartelle in modo semplice e veloce. Tramite diverse opzioni si possono svolgere anche compiti più complessi. Per eseguire lavori più ri­don­dan­ti, potete inserire il comando anche in script shell, così facendo potete ad esempio scrivervi uno script per un backup set­ti­ma­na­le.

Per l’utilizzo quo­ti­dia­no del terminale Linux dovreste tuttavia conoscere più comandi. Per esempio, i seguenti comandi sono in­di­spen­sa­bi­li se volete sem­pli­fi­ca­re il workflow:

Vai al menu prin­ci­pa­le