Командата cp в Linux — пълно ръководство с примери
Подробно ръководство за командата cp в Linux — синтаксис, всички основни флагове (-r, -a, -i, -v, -p, -u, -l, -d, --preserve) и практически примери за копиране на файлове и директории.
Предварителни изисквания
- Основни познания за работа с терминал в Linux
- Разбиране на понятията файл и директория
Командата cp в Linux
Ако прекараш дори час в терминал под Linux, рано или късно ще ти се наложи да копираш файл или папка. Именно за това служи командата cp (от английското copy) — една от най-старите и най-често използвани команди в UNIX-подобните системи. Тя изглежда съвсем проста на пръв поглед, но крие достатъчно нюанси, за да си заслужава подробен разбор — особено ако тепърва навлизаш в света на Linux.
В тази статия ще разгледаме синтаксиса на cp, най-важните ѝ аргументи, практически примери и типични грешки, които начинаещите допускат.
Какво прави командата cp
cp копира файлове и директории от едно място на друго. За разлика от mv (move), тя не премества оригинала — той остава на мястото си, а на новото местоположение се създава негово копие. Това я прави безопасна за експериментиране: ако нещо се обърка, оригиналният файл все още е там.
Командата е част от пакета coreutils, който се доставя по подразбиране с почти всяка Linux дистрибуция, така че няма нужда от допълнителна инсталация.
Основен синтаксис
cp [опции] източник местоназначение
или при работа с множество файлове:
cp [опции] източник1 източник2 ... директория_назначение
Най-простият пример — копиране на един файл в текущата директория с ново име:
cp document.txt document_backup.txt
Тук document.txt е файлът-източник, а document_backup.txt е новото копие. Ако вместо име на файл посочиш само име на директория, cp ще копира файла в нея, запазвайки оригиналното му име:
cp document.txt /home/user/backups/
Основни аргументи (флагове)
По-долу са изброени най-често използваните опции на cp, подредени приблизително по честота на употреба в практиката.
-r или -R (рекурсивно копиране)
Най-важният флаг, ако работиш с директории. Без него cp отказва да копира папка и връща грешка от типа omitting directory.
cp -r /home/user/projects /home/user/projects_backup
Това копира цялата директория projects, заедно с всички файлове и подпапки вътре в нея.
Забележка:
-rи-Rв GNUcpработят практически еднакво за обикновена употреба. Разликата е в третирането на специални файлове (символни връзки), но за ежедневна работа можеш да ги смяташ за взаимозаменяеми.
-i (интерактивен режим)
Пита за потвърждение преди да презапише съществуващ файл. Изключително полезен флаг, особено докато свикнеш с командата, защото cp по подразбиране презаписва тихо, без предупреждение.
cp -i report.pdf /home/user/documents/
Ако в documents/ вече има файл report.pdf, ще видиш нещо от рода на:
cp: overwrite '/home/user/documents/report.pdf'?
-v (verbose / подробен изход)
Показва какво точно копира командата — полезно за проследяване на процеса, особено при копиране на много файлове наведнъж.
cp -rv projects/ projects_backup/
Изходът изглежда приблизително така:
'projects/main.py' -> 'projects_backup/main.py'
'projects/README.md' -> 'projects_backup/README.md'
--debug
Обяснява как точно cp е решила да копира конкретен файл — например дали използва бърз метод чрез копиране на диапазони на файловата система (reflink/copy-on-write), обикновено четене-запис и т.н. Полезен е при диагностика на производителност при копиране на големи файлове. Флагът автоматично включва и -v, така че виждаш и кой файл се копира.
cp --debug bigfile.iso /mnt/backup/
-u (update — само по-нови файлове)
Копира файла само ако не съществува в местоназначението или ако източникът е по-нов от съществуващото копие. Много полезен при синхронизиране на бекъпи, защото не пренаписва излишно вече актуални файлове.
cp -u -r source/ destination/
-p (preserve — запазване на атрибути)
Запазва оригиналните права за достъп (permissions), собственика, груповата принадлежност и времевите маркери (timestamps) на файла. Без -p, копието получава нови времеви маркери (датата на копиране) и права според текущия umask.
cp -p config.yaml config_backup.yaml
-a, --archive (архивен режим)
Точен еквивалент на -dR --preserve=all (в GNU coreutils документацията е записано буквално така: -a е същото като -dR --preserve=all). С други думи, -a включва едновременно:
-R— рекурсивно копиране на директории;-d— запазване на символните връзки (вместо да следва целта им) и запазване на твърдите връзки, където е възможно;--preserve=all— запазване на всички атрибути: права, собственик, група, времеви маркери, контекст (SELinux) и връзки.
Това го прави предпочитаният флаг, когато искаш пълно, точно копие на директория — например за системни бекъпи, където е важно нищо да не се промени в резултат на копирането.
cp -a /etc /root/etc_backup
-d (запазване на връзки, без dereference)
Съкращение за --no-dereference --preserve=links. Когато копираш символна връзка (symlink) с -d, cp копира самата връзка, а не файла, към който тя сочи. Без този флаг, по подразбиране cp следва връзката и копира съдържанието на целевия файл.
cp -d symlink_to_config copied_symlink
--preserve[=ATTR_LIST]
По-гъвкава версия на -p, която позволява да избереш точно кои атрибути да бъдат запазени, чрез списък, разделен със запетаи (ATTR_LIST). Възможните стойности са:
mode— правата за достъп (permissions);ownership— собственик и група (изисква съответните права, обикновено root);timestamps— времена на създаване/промяна;links— запазва твърди връзки между копираните файлове;context— SELinux контекст на сигурност;xattr— разширени атрибути на файловата система;all— всички изброени по-горе едновременно.
Пример — запазват се само правата и времевите маркери, но не и собствеността:
cp --preserve=mode,timestamps report.log report_backup.log
Ако извикаш само --preserve без стойност, поведението е еквивалентно на -p (запазва mode, ownership, timestamps).
-f, --force (принудително презаписване)
Ако файлът в местоназначението не може да бъде презаписан директно (например поради права), -f първо го изтрива, а после създава нов на негово място. Използва се внимателно, тъй като не пита за потвърждение — комбинира се често с -i, при което последно посоченият флаг “печели” (cp -if се държи като -f, а cp -fi — като -i).
cp -f source.conf /etc/app/source.conf
-H (следване на символни връзки само от командния ред)
Действа само при рекурсивно копиране (-R). Ако някой от аргументите, подадени директно в командния ред, е символна връзка, -H кара cp да следва тази връзка и да копира файла, към който тя сочи, вместо самата връзка. Символните връзки, срещнати вътре в копираните директории (не подадени directно в командния ред), не се засягат от този флаг.
cp -RH my_symlink_dir/ backup_dir/
-n (no-clobber — никога не презаписвай)
Обратното на -f. Ако файлът вече съществува, cp просто го пропуска, без грешка и без въпрос.
cp -n *.log /var/backups/logs/
-l, --link и -s, --symbolic-link (създаване на връзки вместо копия)
-l,--link— вместо да копира съдържанието на файла,cpсъздава твърда връзка (hard link) към него. Резултатът е нов “запис” в директорията, който сочи към същите данни на диска — не се заема допълнително пространство, а промяна в единия файл се вижда и в другия, защото физически това е един и същи файл.-s,--symbolic-link— създава символна връзка (symbolic link), подобна на пряк път в Windows. За разлика от твърдата връзка, тя може да сочи и към файл на друга файлова система и лесно се разпознава (командатаls -lя показва със стрелка->).
cp -s /usr/bin/python3 /usr/local/bin/python
Тези флагове са полезни, когато искаш да пестиш дисково пространство или да поддържаш няколко “входни точки” към един и същи файл.
-b / --backup (резервно копие преди презапис)
Ако файл ще бъде презаписан, създава резервно копие на старата версия (обикновено с наставка ~).
cp -b important.conf /etc/app/important.conf
-t (target-directory)
Позволява изрично да посочиш директорията назначение, което е удобно при използване в скриптове с xargs или подобни инструменти.
cp -t /home/user/backups/ file1.txt file2.txt
--parents
Запазва пътя (йерархията от папки) на файла-източник при копирането.
cp --parents src/utils/helpers.py /home/user/backup/
Резултатът ще бъде /home/user/backup/src/utils/helpers.py, а не просто /home/user/backup/helpers.py.
Кои флагове се използват най-често?
В реалната ежедневна работа над 90% от случаите се покриват от следната комбинация:
-r/-R— когато копираш папки.-v— когато искаш да виждаш какво се случва.-i— когато не искаш случайно да презапишеш нещо важно.-a— когато искаш пълно, вярно копие, включително права, собственост и връзки (особено за бекъпи).
Много администратори и разработчици комбинират ги в едно, например:
cp -riv source_folder/ destination_folder/
Тази комбинация копира рекурсивно, пита при конфликт и показва подробен изход — добра “безопасна по подразбиране” практика.
Копиране на множество файлове наведнъж
cp приема произволен брой източници, стига последният аргумент да е директория:
cp file1.txt file2.txt file3.txt /home/user/documents/
Работи и с wildcard символи (glob patterns) на самата shell:
cp *.jpg /home/user/pictures/
Тази команда копира всички файлове с разширение .jpg от текущата директория в pictures/.
Копиране на цяла директория – практически пример
Да кажем, че имаш проект в ~/myapp и искаш да направиш пълен бекъп преди голяма промяна:
cp -av ~/myapp ~/myapp_backup_$(date +%F)
Тук $(date +%F) вмъква текущата дата (напр. 2026-09-24), така че резултатната папка ще се казва myapp_backup_2026-09-24. Това е много разпространена практика при ръчно правене на бекъпи преди рискови операции.
Чести грешки на начинаещите
- Опит за копиране на папка без
-r— завършва с грешкаcp: -r not specified; omitting directory. - Забравено наклонено черта в края на пътя —
cp -r folder destinationиcp -r folder destination/могат да дадат различен резултат в зависимост от това далиdestinationвече съществува. - Презаписване без
-i—cpне пита по подразбиране, така че лесно можеш да загубиш файл, ако не внимаваш. - Объркване между
cpиmv—cpоставя оригинала,mvго премества (изтрива от старото място).
Обобщение
Командата cp е фундаментален инструмент в Linux, който всеки потребител — от начинаещ до опитен системен администратор — използва почти ежедневно. Разбирането на основните флагове (-r, -i, -v, -a, -p) е достатъчно, за да работиш уверено с нея в 95% от случаите. С натрупване на опит ще откриеш и по-специализираните опции като --parents, -u или -l, които стават полезни при по-сложни сценарии — синхронизация на бекъпи, работа със символни връзки или скриптиране.
Съветът е прост: докато свикнеш, работи с -i и -v по подразбиране — те те пазят от неприятни изненади и ти показват какво точно прави системата ти.
Кратка справочна таблица
| Флаг | Пълна форма | Какво прави |
|---|---|---|
-r, -R |
--recursive |
Копира директории рекурсивно |
-a |
--archive |
Еквивалент на -dR --preserve=all — пълно копие |
-d |
--no-dereference --preserve=links |
Копира символните връзки, не целта им |
-i |
--interactive |
Пита преди презаписване |
-f |
--force |
Изтрива и презаписва без въпрос |
-v |
--verbose |
Показва какво се копира |
--debug |
— | Обяснява метода на копиране (включва -v) |
-u |
--update |
Копира само по-нови/липсващи файлове |
-p |
— | Запазва mode, ownership, timestamps |
--preserve=ATTR_LIST |
— | Избираемо запазване на атрибути (mode, ownership, timestamps, links, context, xattr, all) |
-n |
--no-clobber |
Никога не презаписва |
-l |
--link |
Създава твърда връзка вместо копие |
-s |
--symbolic-link |
Създава символна връзка вместо копие |
-H |
— | Следва символни връзки, подадени в командния ред |
-b |
--backup |
Прави резервно копие преди презапис |
-t |
--target-directory |
Изрично задава директория назначение |
--parents |
— | Запазва пълния път на файла в местоназначението |