Перейти к содержимому

Как скопировать символическую ссылку linux

  • автор:

Как скопировать файлы с помощью команды ср в Linux

Как скопировать файлы с помощью команды ср в Linux

Команда cp используется для копирования файлов, с использованием командной строки Linux.

Скопировать файл из одной директории в другую, в Linux

Команда выглядит следующим образом:

Допустим у нас следующая структура папок

Если мы хотим скопировать file01 из текущего местоположения в /home/user/dir1 в /home/user/dir2 , то мы должны выполнить следующую команду в командной строке:

Можно укоротить команду заменив /home/user на

Команда будет выглядеть следующим образом:

Можно также опустить имя файла при копировании если мы его не собираемся переименовывать:

Если мы находимся в целевой папке (в папке куда нужно скопировать файл), то команда сокращается до безобразия:

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

Если мы находимся в папке с копируемым файлом, то команда может приобрести следующий вид:

Делаем резервную копию файла перед его копированием в Linux

Выше мы рассмотрели пример в котором не было копируемого файла в директории приёмнике.

А что если в dir2 есть файл с таким же именем — file01 и мы выполняем команду копирования?

Эта команда перезапишет файл file01 в целевой директории dir2 . Не будет предупреждений, подсказок, сообщения об ошибке, просто перезапишется файл, т.к. команда действительная и без синтаксических ошибок.у.

Для того, чтобы обезопасить себя от перезаписи файла в целевой папке, выполняем команду в следующем виде:

Ну, или же с полными путями

После выполнения этой команды в целевой папке будет скопированный файл file01 и файл с тильдой в конце file01

, который является резервной копией.

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

Имя файла резервных копий будет меняться: file01.

Копирование файла с запросом перезаписи, в Linux

Если мы не хотим делать резервные копии, но хотим убедиться, что не перезапишем файл который находится в целевой папке, то выполним следующую команду:

Сообщение будет выглядеть следующим образом: cp: overwrite ‘./file1’?

Для перезаписи файла жмём Y , для отмены — N или CTRL+C .

Что происходит при копировании символьных ссылок в Linux

Символическая ссылка похожа на ярлык в Windows. Символическая ссылка содержит только адрес к файлу.

Допустим у нас следующая структура папок:

Что делает эта команда:

Она просто копирует файл (именно файл) из одной папки в другую.

А что произойдёт если скопировать символическую ссылку из dir2 (в dir2 , как мы помним, лежит файл с символической ссылкой) в dir3 ?

Мы скопируем в dir3 не ссылку, а сам файл!
На самом деле будет скопирован файл на который указывает символическая ссылка. Это как будто мы копируем file01 из dir1 .

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

Используя ключ -H мы указываем команде cp следовать по символической ссылке к источнику (файлу).

Можно использовать ещё один ключ -L , который указывает на то, что всегда копировать файл, а не символическую ссылку:

Для того, чтобы скопировать символическую ссылку как символическую ссылку, а не как файл на который она указывает, необходимо указать следующую команду:

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

Создаём жесткие ссылки с помощью команды ср

В чем разница между символической ссылкой и жесткой ссылкой?

Символическая ссылка — это ярлык указывающий на файл. Ярлык не содержит сам файл, в нём только адрес который указывает на файл.

Жесткая ссылка, это ещё одно имя файла. Жёсткая ссылка может находиться там же, где и файл (только должно быть другое имя) или в другой директории. Это, по сути, сам файл, но без копирования его. То есть мы можем иметь множество жёстких ссылок на один файл, которые находятся в разных местах, но без физического копирования содержимого файла.
По сути, имя файла, когда он у нас появился в системе и есть первая жёсткая ссылка.
И ещё один момент.
Файл не удалится пока не будет удалена последняя жёсткая ссылка на него, даже если сначала удалим его первое имя, то есть удалим в том месте куда он попал впервые.

Мы отвлеклись от команды cp . Возвращаемся к ней.

Создадим жесткую ссылку с помощью команды ср.

Например у нас есть текстовый файл с Войной и миром, Льва Толстого — voina_i_mir.txt и нам надо, чтобы мы его могли найти в системе как война_и_мир.txt

Можно его просто скопировать и переименовать, но тогда мы займём в два раза больше места.
Создав символическую ссылку мы не обезопасим себя от удаления файла-источника.

Создав жёсткую ссылку мы не копируя сам файл делаем, как бы его копию.

Создаём символическую ссылку с помощью команды ср

Если мы хотим создать символическую ссылку вместо жёсткой, то используем следующую команду:

Это как альтернатива, но лучше использовать команду ln -s , она предпочтительнее cp .

Копируем файл, если он новее файла-назначения

Если мы хотим скопировать файл-источник, но только если он новее файла-назначения с перезаписью последнего, то используем следующую команду:

Если в папке назначения нет такого файла, то будет просто операция копирования.

Как скопировать несколько файлов

Вы можете предоставить более одного исходного файла внутри команды копирования следующим образом:

Приведенная выше команда скопирует файл1 , файл2 и файл3 в папку цель .

Можно использовать шаблоны для массового копирования файлов.

Приведенная выше команда будет копировать все файлы с расширением .mp4 в папку video2 .

Копирование папок командой cp

Папки копируются так же, как копируются файлы.

Например мы имеем следующую структуру папок:

И мы хотим переместить папку dir1 в папку dir2 следующим образом:

Для этого будем использовать следующую команду:

Или можно использовать следующую команду:

Эти команды копируют содержимое dir1 в папку dir2 , а также всё, что находится внутри папки dir1 (и папки, и файлы). Это рекурсивное копирование.

Резюме

В статье я рассмотрел основные команды и ключи для копирования файлов и папок, а также для создания символических и жёстких ссылок.

Команда cp в Linux

При работе в терминале довольно часто приходится копировать файлы. Чаще всего для этого используется команда cp Linux. Она поставляется по умолчанию во всех дистрибутивах и умеет копировать файлы и папки, а также сохранять их атрибуты в файловых системах Linux.

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

Синтаксис и опции cp в Linux

Утилита имеет два возможных варианта синтаксиса для копирования файлов: копирование файла в другой файл с указанным именем:

$ cp опции /путь/к/файлу/источнику /путь/к/файлу/назначения

И копирование файла с сохранением его имени в указанную папку:

$ cp опции /путь/к/файлу/источнику /путь/к/директории/назначения

В первом случае, после выполнения команды файл-источник будет полностью перенесен в файл-назначения. Если же в качестве файла назначения выбрана директория, то файл или каталог будет записан в эту директорию с оригинальным именем.

Утилита имеет несколько интересных опций, которые могут сильно помочь при нестандартных задачах копирования, поэтому давайте их рассмотрим:

  • —attributes-only — не копировать содержимое файла, а только флаги доступа и владельца;
  • -b, —backup — создать резервную копию файла назначения если он существует;
  • —copy-contents — копировать содержимое для специальных файлов (сокеты, файлы устройств);
  • -f, —force — удалить файл назначения перед попыткой записи в него если он существует;
  • -i, —interactive — спрашивать, нужно ли перезаписывать существующие файлы;
  • -n, —no-clobber — не перезаписывать существующие файлы;
  • -P, —no-dereference — копировать сами символические ссылки, а не то на что они указывают;
  • -L, —dereference — копировать не символические ссылки, а то, на что они указывают;
  • -l, —link — создавать жесткие ссылки вместо копирования;
  • —preserve — переносить указанные атрибуты с файла источника в файл назначения, возможные значения: mode, ownership, time‐stamps, context, links, xattr, all;
  • —no-preserve — не переносить указанные атрибуты;
  • —parents — сохранять путь, указанный в файле источнике, в папке назначения;
  • -r, —recursive — копировать папку Linux рекурсивно;
  • —reflink — использовать Copy on Write если это поддерживается файловой системой;
  • -s, —symbolic-link — не выполнять копирование файлов в Linux, а создавать символические ссылки;
  • -S, —suffix — указать суффикс для резервных копий файлов;
  • —sparse — настройка работы с разреженными файлами;
  • -t, —target-directory — считать файл-назначения директорией и копировать файл-источник или директорию-источник в эту директорию с оригинальным именем;
  • -T, —no-target-directory — считать директорию назначения файлом или директорией для записи данных. Если в качестве источника выбран файл, то он будет скопирован с новым именем. Если директория, то её содержимое будет скопировано в директорию назначения;
  • -u, —upgrade — скопировать файл, только если он был изменён;
  • -x, —one-file-system — рекурсивное копирование не должно выходить за пределы этой файловой системы;
  • -v, —verbose — максимально подробный вывод.

Кроме перечисленных выше опций, существуют опции, которые объединяют в себе несколько других с определёнными значениями. Во основные из них:

  • -p — сохранять владельца, временные метки и флаги доступа при копировании, аналогично —preserve=mode,ownership,timestamps;
  • -d — копировать символические и жесткие ссылки именно как ссылки, аналогично —no-dereference —preserve=links;
  • -a — режим резервного копирования, при котором сохраняются все атрибуты, ссылки, а также выполняется резервное копирование папок, аналогично —recursive —preserve=all, —no-dereference;

Теперь, когда вы знаете основные опции, можно перейти к практике. Давайте рассмотрим основные примеры использования утилиты cp.

Примеры использования cp

Для примеров из этой статьи я создам несколько файлов file1, file2, file3, одну символическую ссылку link1 на файл file1 и жесткую ссылку на файл file3. Затем папку source и в ней file4, file5, file6 и папку destination. Вот так можно создать ссылки:

ln -s $(realpath file1) link1 ln file3 hlink1

В результате получится такая структура:

1. Копирование файла в файл

Самый простой пример копирования файлов когда один файл копируется в другое место с заданным именем. Для этого надо указать имя файла в папке назначения. Например, для того чтобы скопировать файл file1 в папку destination с именем file10 нужно выполнить такую команду:

cp file1 destination/file10

Таким же способом можно создать копию файла в той же папке.

2. Копирования файла в папку

Если вам не нужно менять имя файла или надо скопировать несколько файлов, то можно просто указать папку, куда их копировать не указывая имя файла. Например, для того чтобы скопировать файл file1 в папку destination с тем же именем выполните:

cp file1 destination/

Причём в конце команды слеш ставить не обязательно. Утилита и так поймет что это папка.

3. Копирование папки в папку

Для копирования папок нужно использовать опцию -r (—recursive). Скопировать одну папку в другую довольно просто, если папка назначения существует. Для того чтобы скопировать папку source в папку destination выполните команду:

cp -r source destination

Или можно явно указать, что нужно именно скопировать source в destination с помощью опции -t:

cp -t file1 destination

Тогда, если папка destination не существует вы получите ошибку, вместо не очевидного поведения.

4. Копирование содержимого папки в папку

Для копирования содержимого одной директории в другую можно воспользоваться первым вариантом синтаксиса. Команда выглядит аналогичной предыдущему примеру, но она будет работать только если папки назначения не существует. Например, для того чтобы скопировать содержимое папки source в папку destination1 нужно использовать такую команду:

cp -r source destination1/

Если папка назначения существует, то в ней будет создана папка source. Для того чтобы избежать такого поведения можно использовать опцию -T:

cp -rT source destination/

Или же можно явно указать, что вас интересует именно копирование содержимого папки с помощью символа *. Например:

cp source/* destination

Однако в этом случае скрытые файлы, которые находятся в этой папке скопированы не будут. Копирование вложенных файлов и папок работает аналогичным образом.

5. Обработка существующих файлов

По умолчанию, если файл в папке назначения уже существует то он будет перезаписан. Если вы хотите чтобы утилита спросила вас стоит ли перезаписывать каждый существующий файл используйте опцию -i. Например:

cp -i file1 destination

С помощью опции -n можно никогда не перезаписывать существующие файлы:

cp -n file1 destination

Кроме того, для существующих файлов можно делать резервную копию с помощью опции -b или —backup. Например, если использовать опцию -b, то в конце названия файла резервной копии будет добавлен символ тильды

cp -b file1 destination

При использовании опции —backup можно настроить имя резервной копии, Вот доступные варианты:

  • none — резервная копия не делается;
  • numbered — к имени файла будет добавляться номер;
  • simple — в конец файла будет добавлен знак

Например, для того чтобы использовать номер в имени резервной копии используйте такую команду:

cp —backup=numbered file1 destination

Ещё один вариант обработки существующих файлов, который может быть полезен для больших файлов — заменять только если файл источник новее или файл в папке назначения не существует. Для этого нужно использовать опцию -u или —upgrade:

cp -u source/* destination

6. Копирование ссылок

В файловых системах Linux существует такое понятие как символические и жесткие ссылки. Команда cp может копировать их по разному. По умолчанию, как для жестких так и для символических ссылок создается копия файла, уже не связанная с оригиналом. Если вы хотите чтобы символические ссылки копировались именно как ссылки, то нужно использовать опцию -P:

cp -P link1 destination

Для жестких ссылок существует другой подход. Если вы хотите чтобы жесткая ссылка осталась ссылкой после копирования, нужно использовать опцию —preserve со значением links:

cp —preserve=links hlink1 destination

7. Сохранение атрибутов при копировании

По умолчанию cp обновляет временные метки и атрибуты прав доступа файлов при копировании. Но иногда может возникнуть необходимость сохранить оригинальные значения атрибутов. Для этого можно использовать опцию —preserve. Вот её возможные параметры:

  • mode — права доступа, сюда входит чтение, запись, выполнение и дополнительные флаги;
  • ownership — владелец и группа;
  • time‐stamps — временные метки, такие как дата обновления, дата создания и дата последнего доcтупа;
  • context — контекст SELinux;
  • links — сохранение жестких ссылок;
  • xattr — дополнительные атрибуты, которые настраиваются с помощью команды chattr;
  • all — всё выше перечисленное.

Если вы хотите оставить оригинального владельца и права доступа используйте опцию —preserve со значением mode,ownership или же опцию -p:

cp -p source/* destination

Если надо сохранить всю структуру файловой системы, в том числе символические и жесткие ссылки и временные метки, то можно использовать опцию -a:

cp -a source/* destination

8. Копирование и Copy-on-Write

Некоторые новые файловые системы, такие как Btrfs и ZFS поддерживают технологию Copy-on-Write. При её использовании, фактическое копирование данных из файла будет происходить только при его изменении. Эта функция работает в рамках одной файловой системы и сильно ускоряет копирование файлов. Но зато, их изменение может быть немного замедлено. По умолчанию cp использует Copy-on-Write только начиная с версии CoreUtils 9.0. но вы можете включить или отключить её вручную с помощью опции —reflink. Вот доступные значения:

  • always — всегда использовать, если не поддерживается будет выведена ошибка;
  • auto — использовать только если поддерживается;
  • never — никогда не использовать.

Например, для того чтобы включить обязательное использование CoW добавьте —reflink=always в команду копирования:

cp -reflink=always file3 destination

9. Обработка разреженных файлов

Разреженные файлы, это файлы которые содержат последовательности нулевых байт и в них эти последовательности заменены на их описание. Это актуально для образов дисков Qemu или VirtualBox, которые могут содержать много пустого места, которое не обязательно записывать на диск. По умолчанию, cp создает разреженные файлы только если файл источник разрежен. Однако можно настроить его таким образом, чтобы все файлы содержащие последовательности нулей делались разреженными. Настроить это поведение можно с помощью опции —sparse. Вот возможные значения:

  • auto — используется по умолчанию;
  • never — делать разреженные файлы не разрежеными;
  • always — делать файлы разреженными если они содержат достаточное количество нулевых байт.

В качестве примера можно создать образ на основе /dev/zero размером 20 мегабайт:

Если скопировать этот файл с опцией —sparse=always, то он станет разреженным и будет занимать значительно меньше места на диске:

cp —sparse=always ./image1 /destination

Выводы

В этой статье была рассмотрена команда cp Linux. Эта команда существует довольно давно и не очень удобна для копирования больших файлов, поскольку тут нет вывода прогресса копирования. Но зато она поддерживает много других полезных функций. Практически все задачи, по копированию файлов в Linux могут быть выполнены с помощью этой утилиты.

Как скопировать символическую ссылку в Linux?

Используйте cp -P (заглавная P), чтобы никогда не переходить по символической ссылке, а вместо этого скопируйте символическую ссылку. Это можно комбинировать с другими параметрами, такими как -R для копирования иерархии каталогов — cp -RL просматривает все символические ссылки на каталоги, cp -RP копирует все символические ссылки как таковые.

Как скопировать ссылку в Unix?

-Л, –Dereference Следуйте символическим ссылкам при копировании с них. С этой опцией cp не может создать символическую ссылку. Например, символическая ссылка (на обычный файл) в исходном дереве будет скопирована в обычный файл в целевом дереве.

Что произойдет, если вы скопируете символическую ссылку?

Символическая ссылка на ссылку

Если вы используете эту опцию при копировании символических ссылок он создаст ссылку на саму ссылку. … Это потому, что опция -s может создавать только относительные символические ссылки только в текущем рабочем каталоге. Параметр рекурсивного копирования каталогов и папок — -r, -R или –recursive.

Как мне получить список символических ссылок в Linux?

Чтобы просмотреть символические ссылки в каталоге:

  1. Откройте терминал и перейдите в этот каталог.
  2. Введите команду: ls -la. Это будет длинный список всех файлов в каталоге, даже если они скрыты.
  3. Файлы, начинающиеся с l, являются вашими файлами символических ссылок.

Как скопировать символическую ссылку из Linux в Windows?

  1. Использование WinSCP: вы создаете код, который генерирует сценарий WinSCP. Код будет рекурсивно повторять структуру локального каталога. …
  2. Использование архива: недавно я реализовал это для архива ZIP. (Даже в Windows) Вы можете использовать PHP-метод ZipArchive :: setExternalAttributes, чтобы пометить заархивированный файл как символическую ссылку.

Как скопировать источник ссылки?

После того, как адрес будет выделен, нажмите Ctrl + C или Command + C на клавиатуре скопировать это. Вы также можете щелкнуть правой кнопкой мыши любой выделенный раздел и выбрать «Копировать» в раскрывающемся меню.

Как создать ссылку в Unix?

Замените исходный_файл на имя существующего файла, для которого вы хотите создать символическую ссылку (этот файл может быть любым существующим файлом или каталогом в файловых системах). Замените myfile именем символической ссылки. Затем команда ln создает символическую ссылку.

Могу ли я скопировать символическую ссылку?

Используйте ср-п (заглавная P), чтобы никогда не переходить по символической ссылке и вместо этого копировать символическую ссылку. Это можно комбинировать с другими параметрами, такими как -R для копирования иерархии каталогов — cp -RL просматривает все символические ссылки на каталоги, cp -RP копирует все символические ссылки как таковые.

Что делает команда cp в Linux?

Используется команда Linux cp для копирования файлов и каталогов в другое место. Чтобы скопировать файл, укажите «cp», а затем имя файла для копирования.

Копирует ли SCP символические ссылки?

это невозможно — scp будет следовать по символическим ссылкам при использовании с параметром -r. Чтобы скопировать символические ссылки как символические ссылки, вам необходимо использовать fe rsync или аналогичный.

Как мне найти все жесткие ссылки в Linux?

Если вы найдете два файла с одинаковыми свойствами, но не уверены, связаны ли они жестко, используйте команду ls -i для просмотра номера inode. Файлы, которые жестко связаны между собой, имеют один и тот же номер inode. Общий номер inode — 2730074, что означает, что эти файлы являются идентичными данными.

Как использовать find в Linux?

Команда поиска используется для поиска и найдите список файлов и каталогов на основе условий, указанных вами для файлов, соответствующих аргументам. Команда find может использоваться в различных условиях, например, вы можете искать файлы по разрешениям, пользователям, группам, типам файлов, дате, размеру и другим возможным критериям.

Как открыть символическую ссылку в Linux?

Самый простой способ: cd туда, где находится символическая ссылка, и выполните ls -l, чтобы просмотреть детали. файлов. Часть справа от -> после символической ссылки — это место назначения, на которое она указывает.

How to copy symbolic links?

I need to copy them to the current directory. The resulting links should be independent from their prototypes and lead directly to their target objects.

  • cp -s creates links to links that is not appropriate behavior.
  • cp -s -L refuses to copy links to directories
  • cp -s -L -r refuses to copy relative links to non-working directory

What should I do?

Basilevs's user avatar

10 Answers 10

From the man page:

Personally, I use cp -av for most of my heavy copying. That way, I can preserve everything — even recursively — and see the output. Of course, that is just personal preference.

As to why your other options did not do what you expected, -s makes a link instead of copying and -L follows the links in the source to find the file to copy instead of copying the links themselves.

Gaff's user avatar

Just as the man page says, use -P . This setting says:

If the links contain relative paths, then, copying the link will not adjust the relative path. Use readlink , with the switch -f to follow recursively, in order to get the absolute path of the link. For example:

If preserving the relative paths is what you want, than the option -P of cp , as said by Ignacio Vazquez-Abrams, is what you need.

As a few have commented:

Juh_'s user avatar

Most of the time, when I need to copy many symbolic links, I’m actually trying to mirror a directory tree. So I want the symlinks and everything else.

This is overkill for copying just a few symlinks, but if you’re actually trying to copy an entire tree, this can be very useful:

Use tar.

tar doesn’t resolve the symlink by default, so symlinks in the mirror copy will point to the same locations as those in the original tree.

This trick makes use of subshells to get the tar command into position at the root of the directory to be mirrored; you can leave one of them out (along with the associated cd command) if you’re already in the src or dest directories:

Again, this isn’t appropriate for every time you want to copy symbolic links, but it is a very useful snippet to know.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *