Salta al contenuto principale

cp: copia file e directory

Inviato da tuxsa il

cp serve a copiare file e cartelle da un punto all'altro del file system. Dopo aver imparato a creare directory e file vuoti, è il momento di duplicare quelli che esistono già: per fare un backup, per provare una modifica senza rischi, per spostare dati da un disco all'altro.

Cos'è

cp è l'abbreviazione di copy, "copia". Fa parte del pacchetto GNU coreutils ed è un eseguibile (/usr/bin/cp), presente su qualsiasi distribuzione GNU/Linux.

Cosa fa

Crea un duplicato di uno o più file, oppure di un'intera directory con tutto il suo contenuto. L'originale resta dov'è: cp non lo modifica né lo sposta. In caso di successo non stampa nulla.

Un punto importante: se la destinazione esiste già, cp la sovrascrive senza chiedere conferma, a meno che tu non usi le opzioni apposite.

Come si usa

Le due sintassi principali:

$ cp [opzioni] origine destinazione
$ cp [opzioni] origine... directory/

Nella prima copi un elemento dandogli un nuovo nome o percorso; nella seconda copi uno o più elementi dentro una directory esistente.

Esempio 1: copiare un file

$ cp appunti.txt appunti_copia.txt
$ ls
appunti.txt  appunti_copia.txt

Esempio 2: copiare un file in un'altra directory

$ cp appunti.txt backup/
$ ls backup
appunti.txt

Il file mantiene il suo nome. Se vuoi cambiarlo, scrivilo dopo la barra: cp appunti.txt backup/appunti_2026.txt.

Esempio 3: copiare più file insieme

L'ultimo argomento è sempre la destinazione, che deve essere una directory:

$ cp bozza1.txt bozza2.txt bozza3.txt backup/
$ cp *.txt backup/

Nel secondo comando il carattere jolly * viene espanso dalla shell in tutti i file che finiscono per .txt.

Esempio 4: copiare una directory con -r

Per copiare una cartella serve l'opzione -r (recursive), altrimenti cp la ignora:

$ cp Documenti Documenti_backup
cp: -r non specificato; directory 'Documenti' omessa
$ cp -r Documenti Documenti_backup
$ ls
Documenti  Documenti_backup

Esempio 5: copia fedele con -a

L'opzione -a (archive) copia ricorsivamente mantenendo permessi, proprietari, date e link simbolici. È la scelta giusta per i backup:

$ cp -a /var/www/html /home/enzo/backup_sito

Con un cp -r semplice, invece, i file copiati avrebbero la data di copia e i permessi filtrati dalla tua umask.

Esempio 6: chiedere conferma prima di sovrascrivere con -i

$ cp -i appunti.txt backup/
cp: sovrascrivere 'backup/appunti.txt'? n

Con -n (no-clobber), invece, cp non sovrascrive mai i file esistenti e non chiede nulla.

Esempio 7: copiare solo i file più recenti con -u

$ cp -u *.txt backup/

Con -u (update) vengono copiati solo i file che non esistono ancora nella destinazione o che sono più recenti di quelli presenti. Utile per aggiornare una cartella di backup senza ricopiare tutto.

Esempio 8: vedere cosa viene copiato con -v

$ cp -rv Documenti Documenti_backup
'Documenti' -> 'Documenti_backup'
'Documenti/relazione.txt' -> 'Documenti_backup/relazione.txt'
'Documenti/note.txt' -> 'Documenti_backup/note.txt'

Esempio 9: una copia di sicurezza prima di modificare un file

Prima di toccare un file di configurazione, fanne una copia:

$ cp nginx.conf nginx.conf.bak

Con la brace expansion della shell il comando si accorcia, perché la shell lo espande in cp nginx.conf nginx.conf.bak:

$ cp nginx.conf{,.bak}

Esempio 10: uso negli script

Un backup giornaliero con la data nel nome della cartella:

#!/bin/bash
DATA=$(date +%Y-%m-%d)
DEST="$HOME/backup/Documenti_$DATA"

cp -a "$HOME/Documenti" "$DEST" && echo "Backup creato in $DEST"

Il && fa stampare il messaggio solo se la copia è riuscita.

Opzioni utili

  • -r / -R: copia le directory in modo ricorsivo.
  • -a: copia fedele (ricorsiva, con permessi, date, proprietari e link).
  • -i: chiede conferma prima di sovrascrivere.
  • -n: non sovrascrive mai i file esistenti.
  • -u: copia solo se manca la destinazione o l'origine è più recente.
  • -v: mostra ogni file copiato.
  • -p: conserva permessi, proprietario e date (senza essere ricorsivo).
  • -b: prima di sovrascrivere, crea una copia di backup del file di destinazione.

Attenzione a

  • Sovrascrive in silenzio: se copi un file sopra uno con lo stesso nome, quello vecchio è perso. Nei casi dubbi usa -i o -n.
  • Le directory vogliono -r: senza l'opzione, cp le salta e ti avvisa con un messaggio d'errore.
  • Contenuto o cartella? Se la destinazione esiste già, cp -r origine destinazione crea destinazione/origine. Per copiare solo il contenuto di una cartella usa cp -r origine/. destinazione/.
  • I file nascosti con l'asterisco: cp -r origine/* destinazione/ non copia i file che iniziano con il punto, perché il carattere jolly li ignora. Il punto finale di origine/. li include.
  • Proprietario e permessi: senza -a o -p, le copie appartengono a chi esegue il comando e hanno la data di copia.
  • Spazio e permessi: la copia occupa altro spazio sul disco, e servono il permesso di lettura sull'origine e di scrittura nella destinazione.
  • Origine e destinazione uguali: copiare un file su sé stesso dà un errore (sono lo stesso file).

Riepilogo

ComandoCosa fa
cp file copiaCopia un file con un nuovo nome
cp file dir/Copia un file dentro una directory
cp *.txt dir/Copia tutti i file corrispondenti
cp -r dir copiaCopia una directory e il suo contenuto
cp -a dir copiaCopia fedele, ideale per i backup
cp -i file dir/Chiede conferma prima di sovrascrivere
cp -u *.txt dir/Copia solo i file nuovi o più recenti
cp file{,.bak}Crea al volo una copia di sicurezza