Найти в Дзене
UFO.Hosting

Копирование файлов командой cp: подробный гайд

Команда cp — это одновременно простой и мощный инструмент, позволяющий легко копировать файлы в терминале. В этой статье мы сделаем понятный разбор утилиты один из тех инструментов, которые кажутся простыми ровно до момента, когда нужно “скопировать аккуратно”: не потерять права, не перезаписать лишнее, правильно обработать папки, символические ссылки и скрытые файлы. Ниже — практичный разбор cp с примерами и типичными ловушками. Синтаксис команды выглядит так: cp [опции] ИСТОЧНИК НАЗНАЧЕНИЕ Самые частые сценарии: cp report.txt /home/oleg/Documents/ Если в конце путь указывает на существующую директорию, файл окажется внутри неё с тем же именем. cp report.txt report_backup.txt Здесь назначение — новый файл, поэтому получится копия с другим именем. cp a.txt b.txt c.txt /tmp/ В конце обязательно должна быть существующий каталог, иначе cp не поймёт, куда складывать несколько источников. По умолчанию cp просто перезаписывает файл назначения, если он уже существует: cp config.ini /etc/myapp
Оглавление

Команда cp — это одновременно простой и мощный инструмент, позволяющий легко копировать файлы в терминале. В этой статье мы сделаем понятный разбор утилиты один из тех инструментов, которые кажутся простыми ровно до момента, когда нужно “скопировать аккуратно”: не потерять права, не перезаписать лишнее, правильно обработать папки, символические ссылки и скрытые файлы. Ниже — практичный разбор cp с примерами и типичными ловушками.

Базовый принцип: что делает cp

Синтаксис команды выглядит так:

cp [опции] ИСТОЧНИК НАЗНАЧЕНИЕ

  • ИСТОЧНИК — файл или несколько файлов/папок, которые вы копируете.
  • НАЗНАЧЕНИЕ — куда копировать: путь к файлу или папка.

Самые частые сценарии:

1) Скопировать файл в другую папку

cp report.txt /home/oleg/Documents/

Если в конце путь указывает на существующую директорию, файл окажется внутри неё с тем же именем.

2) Скопировать файл и сразу переименовать

cp report.txt report_backup.txt

Здесь назначение — новый файл, поэтому получится копия с другим именем.

3) Скопировать несколько файлов в одну папку

cp a.txt b.txt c.txt /tmp/

В конце обязательно должна быть существующий каталог, иначе cp не поймёт, куда складывать несколько источников.

Как cp ведёт себя при перезаписи

По умолчанию cp просто перезаписывает файл назначения, если он уже существует:

cp config.ini /etc/myapp/config.ini

Это удобно, но рискованно. Чтобы сделать поведение безопаснее, есть три флага:

1. -i — спрашивать перед перезаписью (interactive)

cp -i config.ini /etc/myapp/config.ini

Если файл существует, cp задаст вопрос.

2. -n — никогда не перезаписывать (no-clobber)

cp -n config.ini /etc/myapp/config.ini

Если файл уже есть — копирование просто пропускается.

3. -u — копировать только если источник “новее” (update)

cp -u *.jpg /mnt/backup/photos/

В качестве разового инструмента вполне пойдет, но для более серьезных и надежных синхронизаций принято использовать rsync.

Копирование папок: рекурсия и «копировать как есть»

Если вы попробуете скопировать директорию без опций, получите ошибку. Для папок нужен рекурсивный режим.

1. -r или -R — скопировать папку со всем содержимым

cp -r src_dir/ dst_dir/

Тут есть важный нюанс: что именно получится в dst_dir, зависит от того, существует ли директория назначения.

  • Если dst_dir существует, внутри неё появится src_dir.
  • Если dst_dir не существует, cp создаст её как копию src_dir.

Часто люди ожидают одно, а получают другое. И это одна из самых частых причин вопросов в духе «куда делись все мои файлы?».

2. -a — архивный режим (рекомендуемый «копировать как есть»)

cp -a project/ /mnt/backup/

Опция -a обычно лучший выбор для более безопасного копирования папок: сохраняются права, временные метки, владельцы.

Несколько полезных опций, которые экономят время

1. -t DIR — явно указать папку назначения

Удобно, когда источников много, а назначение хочется держать в начале:

cp -t /var/backups/ a.conf b.conf c.conf

2. --parents — сохранить структуру каталогов

Полезно, если вы копируете файлы из разных мест и хотите “не потерять путь”.

cp --parents ./src/app/main.py ./src/lib/util.py /tmp/package/

В итоге в /tmp/package/ появится src/app/main.py и src/lib/util.py с вложенными папками.

3. Если вы хотите перезаписать, но оставить “старую версию рядом”:

cp --backup=numbered config.ini config.ini

Так рядом появятся файлы вида config.ini.~1~, config.ini.~2~ и т. д. (варианты зависят от реализации cp).