cp è uno dei comandi di base in Unix. Sai già che viene utilizzato per copiare uno o più file o directory dall'origine alla destinazione.
Sebbene questo tutorial sia per principianti, è anche utile per tutti rivedere rapidamente varie opzioni del comando cp usando alcuni esempi pratici.
Anche se utilizzi sempre il comando cp, probabilmente uno o più esempi spiegati di seguito potrebbero essere nuovi per te.
La forma generale del comando copy:
cp [option] source destination
1. Copia un file o una directory dall'origine alla destinazione
Per copiare un file, devi passare l'origine e la destinazione al comando di copia. L'esempio seguente copia il file da project/readme.txt a projectbackup/readme-new.txt
$ cp project/readme.txt projectbackup/readme-new.txt $ cd projectbackup/ $ ls readme-new.txt
Se desideri copiare un file da una cartella a un'altra con lo stesso nome, è sufficiente solo il nome della directory di destinazione, come mostrato di seguito.
$ cp project/readme.txt projectbackup/ $ cd projectbackup/ $ ls readme.txt
Una directory (e tutto il suo contenuto) può essere copiata dall'origine alla destinazione con l'opzione ricorsiva -r come mostrato di seguito:
$ ls project src/ bin/ doc/ lib/ test/ readme.txt LICENSE $ cp -r project/ backup/ $ ls backup src/ bin/ doc/ lib/ test/ readme.txt LICENSE
2. Copia più file o directory
Puoi copiare più di un file dall'origine alla destinazione come mostrato di seguito:
$ cd src/ $ cp global.c main.c parse.c /home/thegeekstuff/projectbackup/src/
Se i file di origine hanno uno schema comune, utilizzare i caratteri jolly come mostrato di seguito. In questo esempio, tutti i file con estensione c vengono copiati nella directory /home/thegeekstuff/projectbackup/src/.
$ cp *.c /home/thegeekstuff/projectbackup/src/
Copia più directory come mostrato di seguito.
$ cd project/ $ cp -r src/ bin/ /home/thegeekstuff/projectbackup/
3. Eseguire il backup prima di copiare in una destinazione
Nel caso in cui il file di destinazione sia già presente con lo stesso nome, cp ti consente di eseguire il backup del file di destinazione prima di sovrascriverlo.
In questo esempio, il file readme.txt esiste sia nella directory project/ che in projectbackup/ e durante la copia da project/ a projectbackup/, viene eseguito il backup del file readme.txt esistente come mostrato di seguito:
$ cd projectbackup $ ls -l readme.txt -rw-r--r-- 1 bala geek 1038 Jan 8 13:15 readme.txt $ cd ../project $ ls -l readme.txt -rw-r--r-- 1 bala geek 1020 Jan 8 12:25 readme.txt $ cp --backup readme.txt /home/thegeekstuff/projectbackup/
Il file esistente è stato spostato in readme.txt~ e il nuovo file è stato copiato come readme.txt come mostrato di seguito.
$ cd /home/thegeekstuff/projectbackup/ $ ls -l -rw-r--r-- 1 bala geek 1020 Jan 8 13:36 readme.txt -rw-r--r-- 1 bala geek 1038 Jan 8 13:15 readme.txt~
Parlando di backup, è importante per te capire come funziona il comando rsync per eseguire il backup dei file in modo efficace.
4. Conserva i collegamenti durante la copia
Quando si esegue il comando cp, se l'origine è un file di collegamento, viene copiato il file effettivo e non il file di collegamento. Nel caso in cui desideri solo copiare il collegamento così com'è, specifica l'opzione -d come mostrato di seguito:
Quanto segue mostra che senza l'opzione -d, copierà il file (e non il collegamento):
$ cd project/bin $ ls -l startup.sh lrwxrwxrwx 1 root root 18 Jan 8 13:59 startup.sh -> ../test/startup.sh $ cp startup.sh /home/thegeekstuff/projectbackup/bin/ $ cd /home/thegeekstuff/projectbackup/bin/ $ ls -l -rw-r--r-- 1 root root 102 Jan 8 14:02 startup.sh
Per preservare il collegamento durante la copia, procedi come segue:
$ cd project/bin $ cp -d startup.sh /home/thegeekstuff/projectbackup/bin/ $ ls -l startup.sh lrwxrwxrwx 1 root root 18 Jan 8 14:10 startup.sh -> ../test/startup.sh
5. Non sovrascrivere un file esistente
Se vuoi copiare solo quando il file di destinazione non esiste, usa l'opzione -n come mostrato di seguito. Questo non sovrascriverà il file esistente e il comando cp restituirà con successo il codice di uscita come mostrato di seguito:
$ cd projectbackup $ ls -l readme.txt -rw-r--r-- 1 bala geek 1038 Jan 8 13:15 readme.txt $ cd ../project $ ls -l readme.txt -rw-r--r-- 1 bala geek 1020 Jan 8 12:25 readme.txt $ cp -n readme.txt /home/thegeekstuff/projectbackup/bin/ $ echo $? 0
Come vedi sotto, il file di destinazione non è stato sovrascritto.
$ cd projectbackup $ ls -l readme.txt -rw-r--r-- 1 bala geek 1038 Jan 8 13:15 readme.txt
6. Conferma prima di sovrascrivere (modalità interattiva)
Quando usi l'opzione -i, ti verrà chiesto di confermare prima di sovrascrivere un file come mostrato di seguito.
$ cp -i readme.txt /home/thegeekstuff/projectbackup/ cp: overwrite `/home/thegeekstuff/projectbackup/readme.txt'? y
7. Crea un collegamento reale a un file (invece di copiarlo)
Quando si esegue il comando cp, è possibile creare un collegamento fisico del file (invece di copiare il file). L'esempio seguente crea il collegamento fisico per il file sample.txt nella directory test/,
$ ls -li sample.txt 10883362 -rw-r--r-- 2 bala geek 1038 Jan 9 18:40 sample.txt $ cp -l sample.txt test/ $ ls -li test/sample.txt 10883362 -rw-r--r-- 2 bala geek 1038 Jan 9 18:40 test/sample.txt
Come visto sopra, test/sample.txt è un file hard linkato al file sample.txt e l'inode di entrambi i file è lo stesso.
8. Crea un collegamento software a un file o una directory (invece di copiare)
Quando si esegue il comando cp, è possibile creare un collegamento software a un file oa una directory. Nell'esempio seguente, viene creato un collegamento simbolico per libFS.so.6.0.0 come libFS.so,
# cd /usr/lib/ # ls -l libFS.so.6.0.0 -rw-r--r-- 1 root root 42808 Nov 19 2010 libFS.so.6.0.0 # cp -s libFS.so.6.0.0 libFS.so # ls -l libFS.so lrwxrwxrwx 1 root root 14 Jan 9 20:18 libFS.so -> libFS.so.6.0.0
9. Conserva gli attributi del file o della directory durante la copia
Usando l'opzione -p, puoi preservare le proprietà di un file o di una directory come mostrato di seguito:
$ ls -l sample.txt -rw-r--r-- 2 bala geek 1038 Jan 9 18:40 sample.txt $ cp -p sample.txt test/ $ ls -l test/sample.txt -rw-r--r-- 2 bala geek 1038 Jan 9 18:40 test/sample.txt
È anche possibile preservare solo le proprietà richieste come modalità, proprietà, timestamp, ecc.
L'esempio seguente conserva la modalità di un file durante la copia:
$ cp --preserve=mode sample.txt test/
10. Copia solo quando il file di origine è più recente della destinazione o manca
La copia non richiede molto tempo per un file di piccole dimensioni, ma potrebbe essere necessario molto tempo quando viene copiato un file di grandi dimensioni. Quindi, durante la copia di un file di grandi dimensioni, potresti voler assicurarti di farlo solo quando il file di origine è più recente del file di destinazione, o quando il file di destinazione manca usando l'opzione -u come mostrato di seguito.
In questo esempio, i due file LICENSE e readme.txt verranno copiati da project/ a projectbackup/. Tuttavia, il file LICENSE esiste già nella directory projectbackup/ ed è più recente di quello nella directory project/.
$ cd project/ $ ls -l LICENSE readme.txt -rw-r--r-- 1 bala geek 108 Jan 8 13:14 LICENSE -rw-r--r-- 1 bala geek 32 Jan 8 13:16 readme.txt $ cd /home/thegeekstuff/projectbackup/ $ ls -l LICENSE readme.txt ls: cannot access readme.txt: No such file or directory -rw-r--r-- 1 root root 112 Jan 9 20:31 LICENSE
Quindi, in questo esempio, non è necessario copiare nuovamente il file LICENSE nella directory projectbackup/. Questo viene gestito automaticamente dal comando cp, se usi l'opzione -u come mostrato di seguito. Nell'esempio seguente, solo il file readme.txt è stato copiato come indicato dal timestamp sul file.
$ cp -u -v LICENSE readme.txt /home/thegeekstuff/projectbackup/ `readme.txt' -> `/home/thegeekstuff/projectbackup/readme.txt' $ cd /home/thegeekstuff/projectbackup/ $ ls -l LICENSE readme.txt -rw-r--r-- 1 bala geek 112 Jan 9 20:31 LICENSE -rw-r--r-- 1 bala geek 32 Jan 9 22:17 readme.txt