
Проблема
При копировании файлов с помощью 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 -H
and cp -L
? Это ожидаемое поведение?
Моя попытка решить:
man cp
говорит мне совершенно то же самое для обоих вариантов, но info cp
'sформулировкаделает это еще более запутанным для меня. Может быть, кто-то поможет мне немного это разобрать:
-H
Если аргумент командной строки указывает символическую ссылку, токопировать файл, на который он указывает, а не символическую ссылкусам по себе. Однако,копировать (сохраняя ее природу) любую символическую ссылкукоторый встречается при рекурсивном обходе.
Мне это кажется противоречием: я полагаю, что »природа символической ссылки« это то, что оно указывает куда-то…
-L, --dereference
Следовать символическим ссылкам при копировании из них. С этой опциейcp
невозможно создать символическую ссылку. Например, символическая ссылка (на обычный файл) в исходном дереве будет скопирована в обычный файл в целевом дереве.
Я знаю, что символическая ссылка — это не обычный файл, но… признаю, что это объяснение для меня слишком сложно.
решение1
С помощью символических ссылок инструменты могут делать две вещи:
- Относиться к символической ссылке как к символической ссылке («сохраняя ее природу»), или
- Относитесь к символической ссылке как к типу файла, на который она указывает.
Сказать, что -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
.