cp -L против cp -H

47

проблема

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

$ ls -l fileA
  fileA -> fileB
$ cp fileA somewhere/ -H
$ ls -l somewhere/
  fileA     # fileA is a copy of fileB, only renamed, with same properties!

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

Вопрос :

Что такое правильное использование cp -Hи cp -L? Это ожидаемое поведение?


  Моя попытка решить : man cpговорит мне совершенно одинаковы для обоих вариантов, но info cp«s формулировка делает его еще более запутанной для меня. Может быть, кто-нибудь поможет мне разобраться в этом немного:

-H Если аргумент командной строки указывает символическую ссылку, скопируйте файл, на который он указывает, а не саму символическую ссылку . Тем не менее, скопируйте (сохраняя природу) любую символическую ссылку, которая встречается при рекурсивном обходе.

Это звучит как противоречие для меня: я предполагаю, что « характер символической ссылки» заключается в том, что она указывает куда-то ...

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

Я действительно знаю, что символическая ссылка не является обычным файлом, но ... я признаю, что здесь слишком много объяснений.

erch
источник
Беги info cp, ищи -R. Это говорит, Copy directories recursively. но вы тестируете с не-каталогами. Разница в том, что внутри копируемых каталогов, а не аргументов командной строки.
Микель
@Mikel Я пытался копировать содержимое каталогов и копировать каталоги с самим контентом, и получил совершенно одинаковые результаты. Кроме того: я сидел довольно долго перед собой info cpи изо всех сил пытался выяснить, что на самом деле означает выбор слов в этой опции & ndash; и о чем эта публикация. Публикация также содержит фактическую формулировку info cp- таким образом, я, по крайней мере, должен был ее открыть…;)
erch

Ответы:

56

С символическими ссылками инструменты могут делать две вещи:

  1. Обрабатывать символическую ссылку как символическую ссылку («сохранение своей природы») или
  2. Рассматривайте символическую ссылку как тип файла, на который она указывает.

Сказать, что -H«сохраняет свою природу» не является противоречием. Рассмотрим альтернативу. Если вы используете -L, любые cpнаходки символических ссылок будут открыты, а их содержимое скопировано в целевое имя файла. Таким образом, источник был символической ссылкой, но его копия не является символической ссылкой. Так что он "потерял свою природу как символическая ссылка".

Рассмотреть возможность

$ mkdir subdir
$ echo "some contents" > subdir/file
$ ln -s file subdir/link

# definition of "list", the abbreviated ls -l output used below
$ list() { ls -l "$@" | \
    awk '$0 !~ /^total/ { printf "%s %s\t%s %s %s\n", $1, $5, $9, $10, $11 }' ; }

$ list subdir
-rw-rw-r-- 14   file  
lrwxrwxrwx 4    link -> file

$ cp -rH subdir subdir-with-H
$ list subdir-with-H
-rw-rw-r-- 14   file  
lrwxrwxrwx 4    link -> file

$ cp -rL subdir subdir-with-L
$ list subdir-with-L
-rw-rw-r-- 14   file  
-rw-rw-r-- 14   link  
Mikel
источник
Отличный ответ - мне нравится, как вы иллюстрируете, что делают варианты. Это не совсем отвечает на мой вопрос, касающийся копирования символических ссылок в одноуровневые каталоги, но вы показали, как я могу провести быстрый эксперимент, чтобы выяснить это. Michael
Майкл Шепер
1
Ах, получается, что я действительно хотел знать, это: superuser.com/a/138594/219388
Майкл Шепер
19

Разница в поведении между -Lи -Hприходит, когда -rэто также указано. cpне будет создавать символические ссылки в подкаталогах, -L -rно будет, если вы используете -H -r.

Кайл Джонс
источник
cp: параметры -H, -L и -P могут не указываться с параметром -r.
3z33etm