Polecenie cp w Linuksie służy do szybkiego kopiowania plików i katalogów, ale jego realna wartość zaczyna się dopiero wtedy, gdy wybierzesz właściwe opcje. W praktyce decydujesz nie tylko o tym, co skopiować, lecz także czy zachować uprawnienia, jak traktować dowiązania symboliczne, kiedy nadpisywać pliki i czy da się przyspieszyć pracę na dyskach obsługujących kopiowanie typu CoW. Ten tekst prowadzi przez użycie, które naprawdę przydaje się na co dzień: od prostych kopii po scenariusze administracyjne i typowe pułapki.
Najważniejsze rzeczy, które warto zapamiętać
-
cpjest najlepsze do lokalnych, jednorazowych kopii i prostych skryptów. -
-ato najbezpieczniejszy wybór przy kopiowaniu drzew katalogów i konfiguracji. -
-i,-ui--backuppomagają ograniczyć przypadkowe nadpisania. - Symlinki, uprawnienia, znaczniki czasu i atrybuty dodatkowe nie kopiują się zawsze tak samo.
- Przy dużych plikach i systemach CoW przydatne bywa
--reflink=auto. - Do synchronizacji między maszynami lub cyklicznych aktualizacji częściej wybieram
rsync.
Czym jest cp i kiedy się sprawdza
cp kopiuje pliki źródłowe do wskazanego miejsca docelowego. Jeśli podasz jeden plik i jedną ścieżkę docelową, dostajesz prostą kopię. Jeśli wskażesz kilka źródeł, celem musi być katalog. Gdy kopiujesz całe drzewo katalogów, zwykle potrzebujesz -r, a w praktyce częściej sens ma od razu -a, bo zachowuje znacznie więcej informacji o plikach.
Ja traktuję cp jako narzędzie do szybkich, lokalnych operacji: kopii konfiguracji, archiwizacji katalogu przed zmianami, przenoszenia plików roboczych między dyskami i prostych zadań w skryptach. To nie jest jednak najlepszy wybór do zadań, w których chcesz porównywać źródło z celem, wykonywać przyrostową synchronizację albo kopiować dane przez sieć. W takich scenariuszach lepiej sprawdza się rsync.
Warto też pamiętać, że domyślne zachowanie cp jest dość bezpośrednie: jeśli plik docelowy istnieje i nie dodasz mechanizmu ochrony, zostanie nadpisany. Z tego powodu znajomość kilku opcji oszczędza więcej czasu niż pamiętanie długiej listy wariantów. Gdy już wiesz, kiedy cp wystarczy, warto dobrać opcje, które zmieniają zachowanie najczęściej.

Opcje, które najczęściej robią różnicę
Najczęściej używane przeze mnie przełączniki da się zamknąć w kilku grupach: ochrona przed nadpisaniem, kopiowanie katalogów, zachowanie metadanych i przyspieszanie pracy na odpowiednim systemie plików. Poniżej zestawiam je tak, jak realnie pomagają w codziennej pracy.
| Opcja | Co robi | Kiedy jej użyć | Na co uważać |
|---|---|---|---|
-a |
Archiwalne kopiowanie, odpowiednik -dR --preserve=all
|
Przy katalogach, konfiguracji, kopiach systemowych | Nie gwarantuje zachowania wszystkiego, jeśli system plików albo uprawnienia to blokują |
-r |
Kopiuje katalogi rekurencyjnie | Gdy chcesz tylko wejść w drzewo katalogów | To mniej precyzyjne niż -a
|
-i |
Pytanie przed nadpisaniem | Przy ręcznej pracy na ważnych plikach | Spowalnia automatyzację, ale dobrze chroni przed pomyłką |
-u |
Kopiuje tylko wtedy, gdy plik źródłowy jest nowszy | Przy odświeżaniu wybranych plików | To nie jest pełna synchronizacja |
--reflink=auto |
Próbuje zrobić lekką kopię typu copy-on-write | Przy dużych plikach na systemach obsługujących CoW | Jeśli CoW nie jest dostępne, spadnie do zwykłej kopii |
--sparse=auto |
Utrzymuje „rzadkie” pliki oszczędzające miejsce | Przy obrazach VM, logach i dużych plikach z obszarami zer | Na złym ustawieniu można niepotrzebnie zajmować więcej miejsca |
-L, -P, -H
|
Określają, czy kopiować linki symboliczne jako linki, czy podążać za nimi | Przy katalogach z dowiązaniami | Zły wybór łatwo zmienia wynik kopiowania |
-t / -T
|
Wymusza katalog docelowy albo traktowanie celu jak zwykłego pliku | Przy skryptach i bardziej złożonych wywołaniach | Pomaga uniknąć dwuznaczności, ale trzeba wiedzieć, co wymuszasz |
Najważniejsze rozróżnienie brzmi tak: -r kopiuje katalogi, a -a próbuje odtworzyć ich stan możliwie wiernie. To druga opcja zwykle daje lepszy efekt przy konfiguracjach, backupach i migracjach. Jeśli jednak zależy ci tylko na prostej kopii kilku folderów, nie zawsze potrzebujesz pełnego archiwum. Dalej pokażę, jak przekłada się to na konkretne polecenia.
Jak kopiować pliki i katalogi bez zgadywania
Najprostsze komendy są najlepsze wtedy, gdy ich znaczenie jest jednoznaczne. Właśnie dlatego warto mieć w głowie kilka wzorców, zamiast liczyć na to, że cp „domyśli się” intencji. Ja zwykle zaczynam od sprawdzenia, czy celem jest pojedynczy plik, katalog czy zestaw plików wrzucanych do jednego miejsca.
Pojedynczy plik
cp raport.txt /backup/
To klasyczny wariant: plik raport.txt trafia do katalogu /backup/. Jeśli katalog istnieje, cp zachowa nazwę źródłową. Jeśli cel nie jest katalogiem, trzeba uważać, bo zachowanie zależy od całej ścieżki i kontekstu.
Cały katalog
cp -a projekt /mnt/backup/
Przy katalogach najczęściej wybieram właśnie -a. Dzięki temu kopia zachowuje znacznie więcej niż zwykłe pliki: strukturę, symlinki, znaczniki czasu i wiele atrybutów, o ile system na to pozwala. To szczególnie ważne przy projektach, gdzie uprawnienia i metadane są równie istotne jak zawartość plików.
Wiele plików do jednego katalogu
cp faktura.pdf umowa.pdf /archiwum/
Ten wariant działa dobrze, gdy masz kilka jasno nazwanych plików i chcesz je wrzucić do jednego folderu. Przy większej liczbie plików wygodniejsze bywa użycie -t, bo wtedy katalog docelowy podajesz raz, a źródła po nim:
cp -t /archiwum/ faktura.pdf umowa.pdf potwierdzenie.pdf
Przeczytaj również: Usuwanie partycji w Linux - Jak zrobić to bezpiecznie i bez błędów?
Gdy nazwa docelowa ma być traktowana jak plik
cp -T wynik.txt /tmp/kopia-wyniku.txt
-T przydaje się wtedy, gdy nie chcesz, by cp interpretował cel jako katalog. To praktyczne w skryptach, w których ścieżka docelowa jest zbudowana dynamicznie i nie chcesz zostawiać tu miejsca na dwuznaczność.
W podobny sposób warto pamiętać o --, jeśli nazwa pliku zaczyna się od myślnika. Na przykład cp -- -tajny.txt /archiwum/ chroni przed potraktowaniem nazwy jako opcji. To drobiazg, ale właśnie takie szczegóły najczęściej ratują skrypty przed niepotrzebnym błędem. Następny krok to zrozumienie, co dzieje się z metadanymi po drodze.
Uprawnienia, symlinki i atrybuty nie kopiują się zawsze tak samo
Tu łatwo o rozczarowanie, bo dwa pliki mogą wyglądać identycznie po nazwie, a różnić się kluczowymi szczegółami. cp bez dodatkowych opcji tworzy plik docelowy z uprawnieniami pochodnymi od źródła, ale na końcu wchodzi jeszcze umask, a dodatkowo znikają bity setuid i setgid, jeśli nie prosisz o zachowanie atrybutów. W praktyce oznacza to, że „skopiowane” nie zawsze znaczy „odtworzone 1:1”.
Jeśli chcesz zachować czas modyfikacji, właściciela i grupę, użyj -p. Gdy potrzebujesz pełniejszego zachowania struktury przy katalogach, -a jest zwykle lepszym wyborem, bo obejmuje także dowiązania, rekurencję i szeroki zestaw atrybutów. Ja traktuję -a jako bezpieczny punkt startowy przy przenoszeniu konfiguracji systemowych i katalogów projektowych.
Warto też rozróżniać symlinki. -L każe podążać za dowiązaniami symbolicznymi, -P mówi, żeby kopiować sam link, a -H jest wariantem pośrednim dla linków podanych bezpośrednio w linii poleceń. Dodatkowo istnieje --keep-directory-symlink, które ma znaczenie wtedy, gdy katalog docelowy jest już dowiązaniem symbolicznym. To nie są ozdobniki, tylko opcje zmieniające wynik kopiowania.
Na systemach z ACL, rozszerzonymi atrybutami i mechanizmami bezpieczeństwa, takimi jak SELinux czy SMACK, część metadanych również może mieć znaczenie. cp potrafi je zachowywać, ale tylko wtedy, gdy wspiera to środowisko i masz odpowiednie uprawnienia. Jeśli kopiujesz obraz systemu, kontener albo katalog produkcyjny, zawsze sprawdzam to dwa razy, bo tu właśnie najłatwiej o cichy błąd. Z tego wynika prosty wniosek: sama znajomość składni nie wystarcza, trzeba jeszcze unikać kilku powtarzalnych pomyłek.
Najczęstsze błędy i kiedy lepiej wybrać inne narzędzie
Najczęstszy błąd jest banalny: ktoś kopiuje katalog bez -r i dostaje błąd albo niepełny rezultat. Drugi problem to zakładanie, że cp zrobi synchronizację. Nie zrobi. Nie usunie z celu plików, które zniknęły ze źródła, i nie przeanalizuje różnic tak, jak robi to narzędzie synchronizujące.
- Kopiowanie konfiguracji bez
-amoże rozbić uprawnienia, czasy i linki, a to bywa ważniejsze niż sama zawartość pliku. - Liczenie na
-njako jedyny bezpiecznik bywa złudne, bo to opcja oznaczona jako przestarzała i ma ograniczone zastosowanie w mieszanych scenariuszach. - Używanie
-iprzy automatyzacji spowalnia działanie i może zatrzymać skrypt na pytaniu o nadpisanie. - Oczekiwanie, że zwykłe
cpzachowa układ katalogów źródłowych po nazwie, prowadzi do chaosu, jeśli nie użyjesz-t,-Talbo--parents. - Brak myślenia o symlinkach potrafi skopiować coś innego, niż było zamierzone, zwłaszcza w katalogach systemowych i repozytoriach zależności.
Jeśli kopiujesz dane cyklicznie, porównujesz katalogi lub przesyłasz pliki między hostami, rsync zwykle daje więcej kontroli i mniej pracy ręcznej. Z kolei do instalowania plików programów z właściwym trybem i właścicielem w Makefile często lepiej pasuje install. cp zostaje wtedy tym, czym jest naprawdę: szybkim narzędziem do lokalnej kopii, a nie rozwiązaniem do wszystkiego. To prowadzi do kilku prostych reguł, które sam stosuję najczęściej.
Kilka reguł, które oszczędzają mi czas przy codziennym kopiowaniu
Gdy pracuję na zwykłych plikach, używam możliwie prostych komend. Gdy kopiuję katalogi konfiguracyjne albo coś, co może mieć znaczenie operacyjne, zaczynam od cp -a. Taki nawyk zmniejsza ryzyko, że pominę coś istotnego tylko dlatego, że pośpieszyłem się z poleceniem.
Przy dużych plikach, obrazach dysków i systemach plików obsługujących copy-on-write warto rozważyć --reflink=auto. To nie przyspieszy każdego przypadku, ale na właściwej macierzy albo partycji potrafi zrobić dużą różnicę, bo kopia powstaje niemal natychmiast, a pełne dane są dublowane dopiero przy zmianie. Z kolei przy plikach z dużymi pustymi obszarami, jak niektóre obrazy maszyn wirtualnych, znaczenie ma --sparse, bo zwykła kopia może bez sensu zjadać miejsce.
W skryptach zawsze wolę jawność od zgadywania: cudzysłowy przy ścieżkach, -- przed nietypowymi nazwami i jednoznaczny wybór między -t a -T. Dzięki temu cp przestaje być komendą „na wyczucie”, a staje się przewidywalnym narzędziem, które robi dokładnie to, co zamierzyłem. Jeśli podejdziesz do niego w ten sposób, wystarczy kilka dobrze opanowanych wzorców, żeby bez stresu obsługiwać większość codziennych zadań w Linuksie.