Copiare cartelle e file nascosti con cp

Vi sarà sicuramente capitato di dover copiare il contenuto di intere cartelle all’interno di altre cartelle. Probabilmente avrete aperto il vostro fidato terminale e avrete dato il comando:

cp -r cartella1/* cartella2/

 

E magari vi sarà capitato di cancellare cartella1 e di scoprire solo dopo che in realtà non avete copiato moltissimi file all’interno di cartella1: tutti quelli nascosti. Se la cartella che stavate copiando era la vostra home, ecco che avete appena combinato un disastro: tutti i file più importanti della home sono dentro cartelle nascoste.

Il carattere “*” infatti significa “tutti i file tranne quelli che iniziano per punto, ossia quelli nascosti”. Si può pensare allora di ovviare al problema lanciando in sequenza:

cp -r cartella1/* cartella2/
cp -r cartella1/.* cartella2/

Ma ecco che appena proverete a lanciare il secondo comando (copia tutti quelli che iniziano per “.”), il vostro terminale vi restituirà degli errori.

Questo è dovuto ad un fatto ben preciso: forse avrete già fatto caso che dentro ogni cartella ci sono due cartelle che si chiamano “.” e “..” e si riferiscono alla cartella stessa e alla cartella precedente. Quando copiate tutto ciò che inizia per punto allora farete una copia della stessa cartella e copierete anche la cartella che viene subito prima nell’albero delle cartelle.

Per risolvere il problema è necessario utilizzare alcune combinazioni particolari dette “wildcards”. Appena posso scrivo un articolo su queste wildcards.

Per il momento mi limito a dirvi che il comando esatto che dovete dare è:

cp -r cartella1/{[!.],.[!.],..?}* cartella2/

I comandi dentro la parentesi significano:

[!.] = escludi tutto ciò che inizia per punto, quindi copia tutti i file non nascosti

.[!.] = escludi tutto ciò che inizia per punto ed è seguito da un altro punto, quindi copia tutti i file anteceduti da un punto, quelli nascosti

..? = copia tutti i file che iniziano con due punti e sono seguiti da qualsiasi altro carattere, quindi ad esempio copierebbe anche file che si chiamano “…ciao”

Va comunque detta una cosa: allenarsi con cp fa bene perchè si imparano cose nuove, tutto quanto però si sarebbe potuto ottenere con un più semplice:

rsync -a test1 test2

Dove l’opzione -a indica “archive mode” ed equivale alla somma di alte opzioni. Guardate le opzioni di rsync digitando man rsync o rsync –help nel vostro terminale.

Buona copia.

EDIT: ho scritto la pagina con le istruzioni su come utilizzare le wildcards, la trovate qui.