cp Linux: come usare al meglio il comando per copiare file

Il comando cp di Linux è uno strumento versatile per copiare file e directory, adatto sia a utenti comuni che amministratori di sistema. Questa guida ne esplora le principali funzionalità.

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.

Ti consigliamo anche

Link copiato negli appunti