Команда cp используется для копирования файлов, с использованием командной строки Linux.
Команда выглядит следующим образом:
cp /источник/путь/файл /цель/путь/файл
Пример:
Допустим у нас следующая структура папок
Если мы хотим скопировать file01
из текущего местоположения в /home/user/dir1
в /home/user/dir2
, то мы должны выполнить следующую команду в командной строке:
cp /home/user/dir1/file01 /home/user/dir2/file01
Можно укоротить команду заменив /home/user
на ~
(тильда)
Команда будет выглядеть следующим образом:
cp ~/dir1/file01 ~/dir2/file01
Можно также опустить имя файла при копировании если мы его не собираемся переименовывать:
cp ~/dir1/file01 ~/dir2
Если мы находимся в целевой папке (в папке куда нужно скопировать файл), то команда сокращается до безобразия:
cp ~/dir1/file01
То есть достаточно указать откуда, а куда - это папка в которой мы находимся сейчас.
Если мы находимся в папке с копируемым файлом, то команда может приобрести следующий вид:
cp file01 ~/dir2
Выше мы рассмотрели пример в котором не было копируемого файла в директории приёмнике.
А что если в dir2
есть файл с таким же именем - file01
и мы выполняем команду копирования?
cp file01 ~/dir2
Эта команда перезапишет файл file01
в целевой директории dir2
. Не будет предупреждений, подсказок, сообщения об ошибке, просто перезапишется файл, т.к. команда действительная и без синтаксических ошибок.у.
Для того, чтобы обезопасить себя от перезаписи файла в целевой папке, выполняем команду в следующем виде:
cp -b file01 ~/dir2
Ну, или же с полными путями
cp -b /home/user/dir1/file01 /home/user/dir2/file01
После выполнения этой команды в целевой папке будет скопированный файл file01
и файл с тильдой в конце file01~
, который является резервной копией.
Можно изменить команду копирования таким образом, чтобы архивные копии нумеровались, чтобы было подобие контроля версий.
cp --backup=numbered /home/user/dir1/file01 /home/user/dir2/file01
Имя файла резервных копий будет меняться: file01.~1~
, file01.~2~
и т.д.
Если мы не хотим делать резервные копии, но хотим убедиться, что не перезапишем файл который находится в целевой папке, то выполним следующую команду:
cp -i /home/user/dir1/file01 /home/user/dir2/file01
Сообщение будет выглядеть следующим образом: cp: overwrite ‘./file1’?
Для перезаписи файла жмём Y
, для отмены - N
или CTRL+C
.
Символическая ссылка похожа на ярлык в Windows. Символическая ссылка содержит только адрес к файлу.
Допустим у нас следующая структура папок:
Что делает эта команда:
cp /home/user/dir1/file01 /home/user/dir3/file01
Она просто копирует файл (именно файл) из одной папки в другую.
А что произойдёт если скопировать символическую ссылку из dir2
(в dir2
, как мы помним, лежит файл с символической ссылкой) в dir3
?
cp /home/user/dir2/file01 /home/user/dir3/file01
Мы скопируем в dir3
не ссылку, а сам файл!
На самом деле будет скопирован файл на который указывает символическая ссылка. Это как будто мы копируем file01
из dir1
.
Такой же результат получим с помощью следующей команды:
cp -H /home/user/dir2/file01 /home/user/dir3/file01
Используя ключ -H
мы указываем команде cp
следовать по символической ссылке к источнику (файлу).
Можно использовать ещё один ключ -L
, который указывает на то, что всегда копировать файл, а не символическую ссылку:
cp -L /home/user/dir2/file01 /home/user/dir3/file01
Для того, чтобы скопировать символическую ссылку как символическую ссылку, а не как файл на который она указывает, необходимо указать следующую команду:
cp -d /home/user/dir2/file01 /home/user/dir3/file01
Также для копирования символической ссылки как ссылки, а не как файл на который она указывает, можно использовать следующую команду:
cp -P /home/user/dir2/file01 /home/user/dir3/file01
В чем разница между символической ссылкой и жесткой ссылкой?
Символическая ссылка - это ярлык указывающий на файл. Ярлык не содержит сам файл, в нём только адрес который указывает на файл.
Жесткая ссылка, это ещё одно имя файла. Жёсткая ссылка может находиться там же, где и файл (только должно быть другое имя) или в другой директории. Это, по сути, сам файл, но без копирования его. То есть мы можем иметь множество жёстких ссылок на один файл, которые находятся в разных местах, но без физического копирования содержимого файла.
По сути, имя файла, когда он у нас появился в системе и есть первая жёсткая ссылка.
И ещё один момент.
Файл не удалится пока не будет удалена последняя жёсткая ссылка на него, даже если сначала удалим его первое имя, то есть удалим в том месте куда он попал впервые.
Мы отвлеклись от команды cp
. Возвращаемся к ней.
Создадим жесткую ссылку с помощью команды ср.
Пример команды:
cp -l /источник/файл /цель/файл
Например у нас есть текстовый файл с Войной и миром, Льва Толстого - voina_i_mir.txt и нам надо, чтобы мы его могли найти в системе как война_и_мир.txt
Можно его просто скопировать и переименовать, но тогда мы займём в два раза больше места.
Создав символическую ссылку мы не обезопасим себя от удаления файла-источника.
Создав жёсткую ссылку мы не копируя сам файл делаем, как бы его копию.
Пример команды:
cp -l /home/user/voina_i_mir.txt /home/user/война_и_мир.txt
Если мы хотим создать символическую ссылку вместо жёсткой, то используем следующую команду:
cp -s /источник/файл /цель/файл
Это как альтернатива, но лучше использовать команду ln -s
, она предпочтительнее cp
.
Если мы хотим скопировать файл-источник, но только если он новее файла-назначения с перезаписью последнего, то используем следующую команду:
cp -u /источник/файл /цель/файл
Если в папке назначения нет такого файла, то будет просто операция копирования.
Вы можете предоставить более одного исходного файла внутри команды копирования следующим образом:
cp /источник/файл1 /источник/файл2 /источник/файл3 /цель
Приведенная выше команда скопирует файл1
, файл2
и файл3
в папку цель
.
Можно использовать шаблоны для массового копирования файлов.
cp /home/user/video1/*.mpv /home/user/video2
Приведенная выше команда будет копировать все файлы с расширением .mp4
в папку video2
.
Папки копируются так же, как копируются файлы.
Например мы имеем следующую структуру папок:
И мы хотим переместить папку dir1 в папку dir2 следующим образом:
Для этого будем использовать следующую команду:
cp -r /home/user/dir1 /home/user/dir2
Или можно использовать следующую команду:
cp -R /home/user/dir1 /home/user/dir2
Эти команды копируют содержимое dir1
в папку dir2
, а также всё, что находится внутри папки dir1
(и папки, и файлы). Это рекурсивное копирование.
В статье я рассмотрел основные команды и ключи для копирования файлов и папок, а также для создания символических и жёстких ссылок.
Вы должны авторизоваться, чтобы оставлять комментарии.
Комментарии ()