Il comando cp Linux, abbreviazione di copy) è uno degli strumenti più basilari e versatili che permettono di copiare file e cartelle. Utilizzandolo, gli utenti possono duplicare i contenuti da una posizione a un’altra all’interno del file system. La semplicità del comando nasconde una grande potenza: grazie a un’ampia gamma di opzioni, cp può essere adattato su Linux a molteplici scenari. Dai trasferimenti dati di base fino a operazioni avanzate che richiedono il controllo sui permessi, sui metadati e sulla struttura delle directory.
Tra i suoi usi più comuni troviamo la copia di singoli file, la duplicazione di intere directory, la gestione sicura di dati sensibili con conferme interattive e l’integrazione in script per automatizzare attività ripetitive.
La capacità di preservare proprietà dei file come i permessi e i timestamp, combinata con opzioni per evitare sovrascritture accidentali o creare collegamenti simbolici, rende il comando cp di Linux uno strumento indispensabile per amministratori di sistema, sviluppatori e utenti comuni.
Copia di file e cartelle con il comando cp Linux
La semplice sintassi di base cp origine destinazione
, permette di copiare un file (origine) in un’altra posizione (destinazione).
Con il comando cp -r origine/ destinazione/
, invece, si può copiare l’intero contenuto della directory specificata verso la destinazione, incluse eventuali sottocartelle e file da esse ospitati.
Aggiungendo l’opzione -p
(esempio: cp -p origine destinazione
), si possono conservare i permessi, i timestamp di modifica e altre proprietà di ciascun elemento.
Le opzioni aggiuntive più utili
Per evitare sovrascritture dei file già esistenti, è sufficiente aggiungere l’opzione -i
al comando cp. Ad esempio: cp -i origine destinazione
In questo modo, il comando cp segnala la presenza di file con lo stesso nome, chiedendo di volta in volta all’utente se procedere o meno con la sovrascrittura. Per evitare qualsiasi sovrascrittura e ignorare quindi i file già esistenti nella cartella di destinazione, si può ricorrere all’opzione -n
.
Viceversa, se si volesse forzare la sovrascrittura degli elementi con nome uguale, basta servirsi della seguente sintassi:
cp -f origine destinazione
Per avere contezza dei file che sono copiati, via via che l’operazione prosegue, è sufficiente servirsi dell’opzione verbose:
cp -v origine destinazione
Come limitare il livello di ricorsione
Supponete di avere a che fare con una cartella contenente molteplici sottodirectory. Il comando cp Linux consente di specificare fino a quale livello applicare eventualmente la ricorsione. Il seguente comando fa in modo che dalla cartella di origine a quella di destinazione siano copiati soltanto gli elementi presenti in corrispondenza del primo livello (il contenuto di eventuali sottocartelle è ignorato):
cp -r --max-depth=1 origine/ destinazione/
Copiare file specifici con cp su Linux
Il comando cp Linux supporta ovviamente l’utilizzo dei caratteri jolly: con cp *.jpg /destinazione/
, ad esempio, si copiano soltanto le immagini in formato JPG verso la destinazione indicata.
Nell’esempio seguente, invece, cerchiamo tutti i file con le estensioni specificate all’interno del percorso di origine per poi copiarli a destinazione:
find /origine/ -type f \( -name "*.jpg" -o -name "*.png" \) -exec cp {} /destinazione/ \;
È anche possibile specificare la volontà di copiare soltanto i file che contengono una specifica stringa nel loro nome:
find /origine/ -type f -name "report_*" -exec cp {} /destinazione/ \;
In questo caso, ci limitiamo ai file con il prefisso report_
. Utilizzando opportunamente i caratteri jolly, si possono specificare sequenze di caratteri centrali o suffissi.
Il comando seguente, così strutturato, si limita invece a copiare tutti i file modificati negli ultimi 7 giorni:
find /origine/ -type f -mtime -7 -exec cp {} /destinazione/ \;
Questa variante, invece, copia i file che hanno dimensioni superiori a 100 MB:
find /origine/ -type f -size +100M -exec cp {} /destinazione/ \;
Copia file con contenuti specifici
Per copiare i file che contengono una certa stringa al loro interno, Linux permette di combinare l’utilizzo di grep:
grep -rl "Errore critico" /origine/ | xargs -I {} cp {} /destinazione/
Il comando riportato a titolo esemplificativo usa grep -rl
per cercare ricorsivamente i file contenenti “Errore critico” (notare l’uso delle doppie virgolette). Il successivo xargs
passa i file trovati al comando cp.
Come copiare la struttura delle directory
Se ci si volesse limitare a ricreare altrove, ad esempio su un’altra unità o supporto di memorizzazione, la stessa struttura delle cartelle e sottocartelle (senza copiare i file contenuti nei percorsi di origine), si può utilizzare il comando che segue. In questo caso non ci serviamo di cp bensì dell’accoppiata find
più mkdir
:
find origine/ -type d -exec mkdir -p destinazione/{} \;
Automazione della copia di file e cartelle
La bellezza di Linux risiede anche nella possibilità di concatenare più comandi in maniera relativamente semplice. Lo abbiamo visto in precedenza e lo vediamo anche in questo suggerimento finale.
Ipotizziamo di voler copiare automaticamente tutti i file modificati nelle ultime 24 ore. L’operazione dovrebbe essere eseguita giornalmente, alle 2 di notte in maniera automatica. Si prenda l’istruzione cron seguente:
0 2 * * * find /origine/ -type f -mtime -1 -exec cp {} /backup/ \;
Utilizziamo cron per copiare i file modificati nel corso dell’ultimo giorno dalla sorgente alla destinazione specificate.
Per configurare un’automazione come quella descritta, è necessario creare o modificare una pianificazione nel file del cron per l’utente o il sistema in uso. Il comando crontab -e
apre il file crontab ovvero la lista delle attività pianificate per l’utente corrente in un editor di testo (di solito nano o un altro editor configurato). È qui che si può inserire l’istruzione cron presentata in precedenza.