cp

Kopiuje pliki i katalogi do innej lokalizacji.

cp to jeden z tych podstawowych klocków, bez których życie w terminalu nie istnieje. Kopiuje pliki i katalogi z jednego miejsca w drugie, nie ruszając oryginału (od tego jest mv). Brzmi banalnie, ale to właśnie cp potrafi po cichu nadpisać Ci ważny plik albo skopiować pół systemu, jeśli pomylisz flagę. Dlatego warto znać kilka opcji na pamięć.

Składnia i najważniejsze opcje

Podstawowa forma to cp [OPCJE] ŹRÓDŁO... CEL. Jeśli podajesz wiele źródeł, CEL musi być katalogiem.

  • -r (lub -R) — kopiuje rekurencyjnie, czyli z całą zawartością katalogu. Bez tego cp odmówi skopiowania folderu.
  • -i — tryb interaktywny: pyta o zgodę zanim nadpisze istniejący plik. Twój pas bezpieczeństwa.
  • -n — nie nadpisuj istniejących plików (no-clobber). Po cichu pomija to, co już jest na miejscu.
  • -f — wymuś: jeśli celu nie da się otworzyć, usuń go i spróbuj ponownie.
  • -p — zachowaj atrybuty: właściciela, uprawnienia i czasy modyfikacji.
  • -a — tryb archiwum, czyli -dR --preserve=all: rekurencyjnie, z linkami symbolicznymi i wszystkimi atrybutami. Idealne do kopii zapasowych.
  • -u — kopiuj tylko, gdy źródło jest nowsze niż cel (lub celu brak).
  • -v — gadatliwie, wypisuje każdy kopiowany plik.

Przykłady użycia

cp plik.txt kopia.txt — tworzy kopię pliku w tym samym katalogu pod nową nazwą.

cp raport.pdf ~/Dokumenty/ — kopiuje plik do katalogu, zachowując jego nazwę.

cp -r projekt/ projekt-backup/ — kopiuje cały katalog z zawartością do nowego folderu.

cp -av /etc/nginx /home/user/backup/ — robi pełną kopię z zachowaniem uprawnień i podglądem, co leci.

cp -i *.conf /tmp/configs/ — kopiuje wszystkie pliki .conf, pytając przed każdym ewentualnym nadpisaniem.

Częste błędy i pułapki

Najgroźniejsze jest ciche nadpisywanie — domyślnie cp nadpisuje cel bez ostrzeżenia. Jeśli zależy Ci na danych, wyrób sobie nawyk -i albo ustaw alias alias cp='cp -i'.

Uważaj na ukośnik przy katalogach: cp -r dir1 dir2 zachowa się różnie w zależności od tego, czy dir2 już istnieje (skopiuje do środka albo utworzy jako kopię). To klasyczny powód niespodzianek.

Różnice między systemami: na Linuksie masz GNU coreutils, na macOS i BSD wersję BSD. Flaga --backup oraz długie opcje typu --preserve=all to GNU — na macOS ich nie znajdziesz. Tam do bogatszych potrzeb używa się raczej rsync albo ditto. Samo -r, -p, -a działa na obu.

I klasyk: cp nie skopiuje katalogu bez -r — zobaczysz tylko omitting directory.

Powiązane komendy: mv (przenoszenie), rsync (kopiowanie z synchronizacją i po sieci), scp (kopiowanie przez SSH), install, ditto (macOS), rm.