cp -L проти cp -H


45

Проблема

Копіюючи файли з 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та cp -L? Це очікувана поведінка?


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

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

Для мене це звучить як протиріччя: я думаю, що "природа символічної ланки " полягає в тому, що вона десь вказує ...

-L, --dereference Дотримуючись символьних посилань, копіюючи з них. За допомогою цієї опції cpне можна створити символічне посилання. Наприклад, символьне посилання (до звичайного файлу) у вихідному дереві буде скопійовано у звичайний файл у дереві призначення.

Я знаю, що симпосилання не є звичайним файлом, але… Зізнаюся, тут я перестала бути спрощеною цим поясненням.


Біжи info cp, шукай -R. У ньому написано, Copy directories recursively. але ви тестуєте з не-каталогів. Різниця полягає в тому, що знаходиться всередині каталогів, які ви копіюєте, а не в аргументах командного рядка.
Мікель

@Mikel Я намагався скопіювати вміст каталогів і сам скопіювати каталоги зі змістом і отримав цілком однакові результати. Також: Я досить довго сидів навпроти info cpі намагався розібратися, що насправді означає вибір слів у цьому варіанті & ndash; і про яку йдеться у цій публікації. У публікації також міститься фактичне формулювання від info cp- таким чином я, мабуть, принаймні відкрив її…;)
erch

Відповіді:


55

За допомогою посилань інструменти мають дві речі:

  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  

Чудова відповідь - мені подобається, як ти ілюструєш те, що робиш. Це не зовсім відповідає на моє запитання, що стосується копіювання посилань на каталоги братів, але ви зрозуміли, як я можу зробити швидкий експеримент, щоб це з'ясувати. 😉
Майкл

1
А, виявляється, я дуже хотів дізнатися це: superuser.com/a/138594/219388
Michael Scheper

19

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


cp: параметри -H, -L та -P не можуть бути задані параметром -r.
3z33etm
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.