Vuoi sapere come usare il comando cp su Linux? Ecco una guida pratica che ti mostrerà vari casi d’uso e opzioni di questo comando.
Quando si lavora da terminale su distribuzioni basate su Linux, che sia sul tuo computer locale o collegandoti al terminale di un hosting semidedicato, uno dei comandi da conoscere e usare correttamente è il comando cp per la copia di file e/o cartelle.
Vediamo come si usa.
Table of Contents
Sintassi del comando cp
Per approcciarci per la prima volta a un nuovo comando da terminale, bisogna partire dalla sintassi di base. Una volta capiti gli argomenti da passare al comando e il suo funzionamento generale, potremo passare a vedere le opzioni.
In genere la sintassi del comando cp (copy) è questa:
cp [opzioni] file-da-copiare directory-di-destinazione
Quindi, molto semplicemente, per usare il comando bisogna specificare il nome del file da copiare e la destinazione, vale a dire la cartella in cui vogliamo copiarlo. Vedremo in seguito a cosa servono le opzioni, per il momento ti basti sapere che sono facoltative.
Il comando cp può essere usato anche per creare la copia di un file nella stessa posizione del file di origine. In questo caso, dovremo usare questa sintassi:
cp [opzioni] file-di-origine file-di-destinazione
In questo modo stiamo copiando il contenuto del file di origine in quello di destinazione. Se ancora non ti è molto chiaro, dopo vedremo degli esempi che ti aiuteranno a capire bene l’uso di questo comando in diverse circostanze.
Per finire la terza opzione principale che abbiamo è quella di usare il comando cp per copiare più file. La sintassi sarà:
cp [opzioni] file-1 file-2 file-3 directory-di-destinazione
In questo caso quindi stiamo copiando i tre file in una determinata cartella.
Ora che abbiamo visto in maniera molto basilare l’uso del comando, passiamo a dei casi pratici di uso con esempi che ti aiuteranno a capire al meglio come usare cp.
Casi d’uso più semplici del comando cp
Per capire bene come usare questo comando Linux, vedremo degli esempi specifici. Partiamo dagli usi più comuni:
- copiare un file;
- copiare un file in una cartella diversa da quella di origine;
- copiare contemporaneamente più file.
Dopodiché passeremo all’uso delle opzioni del comando, grazie alle quali potremo anche creare copie di intere cartelle.
Copiare un file nella stessa cartella
Possiamo usare il comando cp per creare una copia di un file, scegliendo il nuovo nome da dare al file. In pratica è come se stessimo copiando e rinominando la copia.
Nota che per poter usare il comando cp dobbiamo essere entrati nella cartella in cui è contenuto il file da copiare. Se hai difficoltà o non ricordi alcuni comandi, puoi controllare la lista dei comandi linux più usati.
Facciamo un esempio pratico, abbiamo il file di testo “appunti.txt” e vogliamo creare una copia di questo file nella stessa cartella del file di origine. Vogliamo, inoltre, che la copia del file si chiami “ricerca.txt”.
Per farlo diamo il seguente comando:
cp file-da-copiare nome-file-copiato
Che nel nostro esempio sarà:
cp appunti.txt ricerca.txt
Dando questo comando e premendo invio, verrà eseguita la copia.
A questo punto per verificare che il file sia stato creato, senza uscire dal terminale, possiamo dare il comando ls
per mostrare i file all’interno della cartella.
Per verificare che la copia sia stata eseguita correttamente e quindi che il contenuto del file sia corretto, in questo caso visto che si tratta di un file testuale, possiamo usare il comando cat
.
Come puoi vedere dalla schermata, in questo caso ho creato un file di esempio con una sola riga di testo per mostrare il risultato.
Ecco quindi il risultato.
In questo caso il file “ricerca.txt” non esisteva, quindi il comando cp ha creato una copia del file “appunti.txt” creando un file chiamato “ricerca.txt”.
Qui bisogna aprire una parentesi importante che riguarda la sovrascrittura dei dati. Cosa succede quando usiamo come nome di destinazione, il nome di un file già esistente?
Se il file “ricerca.txt” esiste già e noi usiamo il comando cp, stiamo sovrascrivendo il suo contenuto. Vediamo un esempio pratico.
Ho creato un nuovo file chiamato “nuovo.txt” con un contenuto diverso da quello del file appunti.txt e ricerca.txt. Ora uso il comando cp per copiare:
cp nuovo.txt ricerca.txt
Così facendo sto sovrascrivendo il contenuto del file “nuovo.txt” in “ricerca.txt”. Infatti ora il contenuto è cambiato, come mostro nella schermata qui sotto:
Questa operazione di sovrascrittura che abbiamo appena visto, può sembrare banale, ma non lo è affatto per chi ad esempio è abituato ai metodi di copia di Windows. Su Windows quando copiamo un file viene automaticamente creato un file con un nome di base “Copia di nome-file-precedente“. Inoltre quando rinominiamo un file e c’è un altro file con lo stesso nome già esistente, ci viene mostrato un avviso.
Quando creiamo delle copie da terminale su Linux, usando il comando cp come abbiamo appena visto, non riceviamo avvisi e possiamo rischiare di perdere dati per disattenzione. Per fortuna, però, ci sono alcune opzioni del comando cp, come “-i”, che ci permettono di evitare errori. Le vedremo dopo nel dettaglio, ora passiamo al secondo caso d’uso.
Copiare un file in una cartella diversa
In questo caso vediamo come copiare un file in una cartella differente. Se creiamo la copia di un file in una cartella diversa, non dobbiamo necessariamente specificare un nuovo nome per il file.
Il comando si usa in questo modo:
cp nome-file /percorso/
O, se vogliamo anche rinominare la copia, così:
cp nome-file /percorso/nuovo-nome-file
Vediamo due esempi pratici.
Questa è la situazione di partenza della cartella SupportHost che ho aperto da terminale: ci sono tre file di testo e una cartella “Ricerche”.
Voglio copiare il file “ricerca.txt” dalla cartella SupportHost alla cartella Ricerche e mantenere lo stesso nome. Allora uso questo comando:
cp ricerca.txt Ricerche/
Per creare una copia del file e scegliere un nome differente, mi basta specificare il nome del file dopo il percorso della cartella, così:
cp ricerca.txt Ricerche/ricerca-1.txt
In questo caso ho copiato il file e cambiato nome del file nella cartella di destinazione.
Copiare più file in una cartella diversa
Possiamo anche copiare più file con un solo comando, in questo caso dobbiamo seguire questa sintassi:
cp file-1 file-2 /percorso/
Nel nostro esempio copio due file in una sottocartella, così:
cp appunti.txt ricerca.txt Ricerche/
Tieni presente che questo è solo un esempio, puoi anche copiare più di due file, ti basta specificare i nomi uno dopo l’altro.
Fare copie di file e cartelle usando le opzioni
Nella prima sezione abbiamo visto gli usi più semplici del comando cp per fare copie di uno o più file.
Per passare alla copia di intere cartelle, è necessario introdurre anche le opzioni del comando cp. Grazie alle opzioni, infatti, possiamo gestire gli avvisi di sovrascrittura e fare copie di tutto il contenuto della cartella.
Vediamo tutto man mano con degli esempi pratici.
Come copiare intere cartelle
Il comando cp non serve solo per la copia dei file, ma ci permette anche di copiare cartelle con tutto il loro contenuto (file ed eventuali sottocartelle).
Ci sono due casi principali:
- creare una copia della cartella 1 con tutto il suo contenuto nella cartella 2.
- creare una copia del contenuto della cartella 1 nella cartella 2, ma senza portarci dietro la “cartella 1”.
Chiariamo meglio la distinzione con un esempio.
Copiare cartella in un’altra cartella
Nella nostra cartella di lavoro, abbiamo due cartelle: Ricerche e Guide.
Uso il comando di copia seguente:
cp -R Ricerche Guide
Con questo comando stiamo creando una copia della cartella “Ricerche” all’interno della cartella “Guide”, quindi alla fine avremo:
- Guide
- Ricerche
- File della cartella Ricerche: ricerca1.txt, ricerca2.txt, ecc.
- Ricerche
Questa copia è resa possibile grazie all’opzione “-R
” che permette la copia ricorsiva dei file (e cartelle) all’interno di una cartella.
Copiare contenuto cartella in un’altra cartella
In alternativa possiamo scegliere di copiare solo il contenuto della cartella di origine nella cartella di destinazione.
Per farlo dobbiamo usare l’opzione -T in questo modo:
cp -RT Ricerche Guide
Riprendendo l’esempio di prima avremo:
- Guide
- File della cartella Ricerche.
Quindi avremo copiato il contenuto della cartella “Ricerche” nella cartella “Guide”. A differenza di prima, stavolta non abbiamo copiato la cartella superiore “Ricerche”, ma solo i suoi file (ed eventuali sottocartelle).
Copiare file con avvisi di sovrascrittura
Come abbiamo visto prima, durante la copia di un file, se ne esiste già un altro con lo stesso nome, il comando cp sovrascrive in automatico senza chiederci conferma.
Per evitare sovrascritture non desiderate, possiamo usare l’opzione -i
(interactive).
Vediamo cosa succede quando facciamo una copia usando questa opzione.
cp -i ricerca.txt Guide/
Sto copiando un file in una cartella in cui esiste già un file con lo stesso nome. Usando l’opzione -i
, il terminale ci avvisa e ci chiede se vogliamo sovrascrivere o no il file.
- Per confermare digitiamo “y” e diamo invio.
- Se vogliamo annullare la sovrascrittura possiamo digitare “n” e dare invio, così la copia verrà annullata.
Copiare file evitando la sovrascrittura
Un’altra possibilità che abbiamo è quella di fare delle copie di file e cartelle bloccando la sovrascrittura.
Usando l’opzione -n
, ogni volta che ci saranno file o cartelle già esistenti, la copia di questi verrà annullata e non ci saranno sovrascritture.
Nota che l’opzione -n potrebbe avere dei problemi. Al momento della prova su Kubuntu con apt, l’opzione -n per il comando cp non funziona e mostra questo warning:
cp: warning: behavior of -n is non-portable and may change in future; use --update=none instead
Seguire il progresso durante la copia dei file
Come abbiamo visto prima, il comando cp ci permette di fare la copia di singoli file, ma anche di file multipli e di intere cartelle.
Quando ci ritroviamo a dover copiare molti file, può tornarci utile seguire il progresso dell’operazione di copia.
Per farlo è sufficiente usare l’opzione -v
prima di avviare la copia.
Ecco qui un esempio in cui ho copiato una cartella e mi vengono mostrati i progressi durante la copia dei file al suo interno.
Il comando usato:
cp -Rv Guide /home/kubuntu/Downloads
Ecco i progressi da terminale:
In questo esempio ho usato l’opzione “-R
” per la copia della cartella e l’opzione “-v
” per mostrare il progresso durante la copia dei file. Proprio come ho fatto in questo esempio, quando vuoi usare più opzioni per un comando, le puoi raggruppare.
Per avere una vera e propria barra di avanzamento durante la copia, è preferibile usare il comando rsync
, vedremo alla fine dell’articolo come fare a usarlo con degli esempi.
Copiare mantenendo gli attributi dei file
Quando creiamo una copia di un file, stiamo di fatto creando un nuovo file. Questo significa che la copia avrà proprietà diverse per quanto riguarda ad esempio la data di modifica del file.
Per conservare gli attributi del file di origine, possiamo usare l’opzione -p
, così:
cp -p nome.file /percorso/cartella-destinazione
In questo esempio ho creato una copia del file “ricerca.txt” in un’altra cartella e usato l’opzione “-p” per preservare gli attributi, in questo caso si vede che la data di modifica del file è rimasta invariata dopo la copia.
Usare il wildcard per copiare più file
Linux ci permette di usare il wildcard (*) che rappresenta un numero variabile di caratteri per copiare più file che corrispondono a determinate caratteristiche.
Per esempio potremmo voler copiare tutti i file che iniziano con un determinato nome, oppure tutti i file che hanno una determinata estensione.
Facciamo un esempio pratico. All’interno della cartella “Guide” abbiamo file con diverse estensioni txt, odt e ods. Possiamo scegliere di copiare solo i file con l’estensione txt, in questo modo:
cp *.txt /percorso-cartella/
Ecco qui il risultato della copia:
Creare un link simbolico invece di una copia
Con il comando cp di Linux possiamo creare dei link simbolici che funzionano come collegamenti a file o cartelle.
Per farlo ci basta usare l’opzione -s così:
cp -s /percorso/file /percorso/file-simbolico
Tieni presente che devi specificare il percorso completo, come in questo esempio in cui ho creato un link simbolico verso il file “ricerca.txt”, chiamando il link simbolico “file-ricerca.txt”:
Questo è solo un esempio, puoi utilizzare questo stesso comando anche per creare link simbolici di più file all’interno di una cartella.
Ecco un esempio:
cp -s /percorso/Ricerche/ricerca*.txt /percorso/documenti/
Questo comando qui sopra combina diverse opzioni che abbiamo visto finora.
- Grazie al wildcard vengono presi tutti i file che corrispondono a questa stringa “ricerca*.txt” quindi che hanno un valore variabile tra “ricerca” e l’estensione, quindi ad esempio ricerca1.txt, ricercaArgomenti.txt, ecc.
- Con l’opzione -s, si creano dei link simbolici invece che una vera e propria copia.
Comandi simili a cp
Se hai già familiarità con Linux e i comandi da terminale, saprai che ci sono più comandi che possono essere usati per lo stesso scopo o per scopi simili.
Per quanto riguarda cp, ci sono diversi comandi correlati, eccone alcuni.
mv
Il comando mv
serve a spostare file e cartelle da una posizione all’altra. Possiamo usarlo anche per rinominare i file senza spostarli.
Sintassi per rinominare un file:
mv nome-file.txt nuovo-nome-file.txt
Esempio pratico di file rinominato con mv.
ln
Ci permette di creare link simbolici e hard link. I link simbolici si creano con ln e l’opzione -s, come abbiamo visto anche per cp.
Sintassi per creare un link simbolico (nella stessa cartella, altrimenti specificare il percorso):
ln -s nome-file-origine nome-file-link-simbolico
Ecco un esempio in cui ho creato un link simbolico “file-ricerca.txt” nella stessa cartella del file di origine “ricerca.txt” con il comando:
ln -s ricerca.txt file-ricerca.txt
rsync
Ci permette di copiare file e di sincronizzarli. Si usa soprattutto per la sincronizzazione di cartelle tra due macchine, una in locale e una in remoto, per esempio tra pc e server tramite una connessione SSH.
Sintassi per sincronizzare tutti i file tra due cartelle:
rsync -a cartella-origine/ cartella-destinazione/
Con il comando rsync, la prima volta copiamo il contenuto della cartella di origine in quella di destinazione, mentre successivamente quando usiamo di nuovo il comando stiamo sincronizzando i file: questo significa che i file che sono stati modificati nella cartella di origine verranno sovrascritti in quella di destinazione.
Possiamo usare rsync anche per la copia di file in locale. Rispetto a cp, rsync può essere più utile quando stiamo copiando file molto grandi perché ha un’opzione per mostrare il trasferimento dei file. Ecco un esempio:
rsync --progress -h ~/cartella-origine/file-origine ~/cartella-destinazione/
Nel mio esempio ho usato il comando seguente:
rsync --progress -h Archivio.zip ~/Downloads/
Con questo comando sto creando una copia dell’archivio nella cartella Downloads.
Con l’opzione “--progress
” stiamo chiedendo di mostrarci il trasferimento, mentre con l’opzione “-h
” avremo il progresso in Megabyte o Kilobyte (e sarà quindi più leggibile rispetto ai byte).
Invece, per copiare intere cartelle con rsync possiamo usare l’opzione -a
(che sta per Archivio), come in questo esempio:
rsync -a --progress -h ~/Documents/SupportHost ~/Downloads/
Il comando rsync in questo caso crea una copia della cartella “SupportHost” e di tutto il suo contenuto, nella cartella “Downloads”. In questo caso la cartella non esisteva e quindi ci viene mostrato il progresso man mano che vengono creati tutti i file.
Dopo aver fatto delle modifiche alla cartella di origine, possiamo risincronizzarle dando nuovamente lo stesso comando, nella schermata qui sotto puoi vedere che è stato sincronizzato solo il file “appunti.txt” perché era l’unico che era stato modificato.
scp
Il comando rsync serve proprio a tenere i file sincronizzati, mentre per la semplice copia in modo sicuro (e con connessione SSH) possiamo usare il comando scp
.
Sintassi per la copia di un singolo file:
scp opzioni file-da-copiare.txt Cartella-di-destinazione/
Conclusioni
A questo punto se hai seguito la guida e provato a mettere in pratica questi esempi, avrai abbastanza familiarità con il comando cp. Si tratta di uno dei comandi più importanti da conoscere quando si vogliono fare operazioni da terminale e, come abbiamo visto, è bene sapere esattamente come funziona se non vogliamo rischiare di sovrascrivere per sbaglio dati importanti!
Se hai ancora dubbi sull’uso di questo comando, ricordati che puoi dare da terminale il comando:
man cp
In questo modo richiamerai la documentazione completa del comando cp e potrai vedere tutte le opzioni. In questo articolo ti ho mostrato le più utili, ma ce ne sono altre che potresti voler approfondire.
Hai dubbi o vorresti suggerire altri esempi da aggiungere a questa guida? Lascia un commento per farcelo sapere!
Lascia un commento