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

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

Проблема

При копировании файлов с помощью 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!

Этот ответ здесьописывает оба варианта как похожие, ЕСЛИ ТОЛЬКО они не используются в сочетании с -R. Не для меня. Мягкие, поскольку файлы с жесткими ссылками становятся переименованными копиями файлов, на которые они указывают в источнике.
 

Вопрос:

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


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

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

Мне это кажется противоречием: я полагаю, что »природа символической ссылки« это то, что оно указывает куда-то…

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

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

решение1

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

  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  

решение2

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

Связанный контент