cp je základní příkaz v Linuxu pro kopírování souborů, stejně jako copy ve Windows. Ostatně je zkratka právě z oné delší verze.
Funguje klasicky, tedy napíšete cp odkud kam a systém vytvoří kopii. V odkud je možné uvádět jméns souborů ale používat i zástupné znaky (* a ?) pro výběr více souborů. Pozor na to, že skryté soubory (ty co začínají tečkou) to bude ignorovat.
Vtip s tečkovanými soubory je, že
- cp -a zdroj/* cil/ # nekopíruje je
- cp -a zdroj/. cil/ # je kopíruje
- cp cp -a zdroj cil/ # je kopíruje
Základní příklady použití
Základní kopie jednoho souboru
cp foto.jpg /mnt/usb/
Více souborů do adresáře (ano, jako zdroj jde uvádět víc věcí, cíl je pak ten poslední)
cp *.png *.jpg /mnt/usb/obrazky/
Kopie včetně skrytých souborů (nepoužívat hvězdičku)
cp -a projekt/. /mnt/backup/projekt/

TIP: Chcete návod? V Linuxu prostě zkustei man cp. Na webu třeba v cp(1) — Linux manual page
Kopírování složek
Umí kopírovat i složky (tedy jejich obsah), ale tam musíte použít -r jako parametr. Tedy něco jako cp -r vychozislozka/ cilovaslozka/
MImochodem, místo -r se doporučuje používat -R.
Hodit se alespíše může -a (-dR –preserve=all) což je kombinace rekurze (tedy obsahu složek) a zachování práv, vlastníka, časů, symlinků, ACL, xattr atd
Rekurzivní kopie adresáře (doporučeně -a)
cp -a projekt/ /mnt/backup/
Aby toho nebylo málo, tak je tu ještě –parents, které v cíli vytvoří i cestu. Tedy tu původní cestu ke zdroji, pro názornost:
cp –parents a/b/c.txt /backup/ → /backup/a/b/c.txt (tedy v /backup vytvoří ony složky)
Zachovat cestu (parents)
cp –parents src/app/config.yaml /backup/
“Synchronizace” pouze nových/novějších souborů
cp se v základní podobě dá použít pro zálohování/synchronizaci, ale tam je vhodné využít -u. Zajistí, že se budou kopírovat pouze novější soubory+ty co v cíli chybí a ne tedy vše co ve výchozí složce máte. Pochopitelně tedy v kombinaci jako -ru
Kopie pouze novějších souborů (rychlé „přisypání“)
cp -a -u zdroj/ cil/
TIP: pokud chcete opravdu synchronizovat, naučte se používat rsync
Ochrana proti blbosti
cp prostě spustíte a ono kopíruje a klidně přepíše cokoliv, co v cílovém místě je a nebude se na nic ptát. Pokud chcete aby se ptalo, použijte -i (interaktivně).
Užitečné je -n (no-clobber) které zajistí, že pokud v cíli už soubor existuje, nepřepíše ho. Opak je -f (force) s vynuceným přepsáním.
Bezpečně – nepřepisuj existující
cp -a -n zdroj/ cil/
Šikovné je -b (–backup) kde případné přepsání vytvoří zároveň zálohu. Původní jméno souboru doplněné o příponu (tu lze určit pomocí –suffix)
Při přepisu dělej zálohu s příponou .bak
cp -a –backup –suffix=.bak zdroj.cfg /etc/zdroj.cfg
Podrobně vidět co se děje
Podobně užitečné je -v (verbose) kde probíhající cp bude vypisovat co kopíruje (odkud kam).
Včetně atributů
Pokud chcete aby v cílovém podobě byly zachovány atributy (vlastnosti), tak použijte -p. Bez přidání budou mít kopie nový timestamp, vlastníka i mode podle toho kam kopírujete. S -p timestamp zůstane. Pro zachování vlastnictví bude třeba spouštět přes sudo (či jiný odpovídající spůsob)
Symlinky
Také dost důležité:
- -d (kopíruj symlinky jako symlinky)
- -L (následuj symlinky)
- -P (nenásleduj).
Jde i nevytvářet kopie, ale vytvořit symlinky s pomocí -l (hardlinky), -s (symlinky). Což vám ale neudělá duplikát (kopii) ale jen “odkaz” na originál.
