Команда 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 (и папки, и файлы). Это рекурсивное копирование.
В статье я рассмотрел основные команды и ключи для копирования файлов и папок, а также для создания символических и жёстких ссылок.
Вы должны авторизоваться, чтобы оставлять комментарии.
Комментарии ()