cp -L vs. cp -H

45

Problem

Podczas kopiowania plików za pomocą cp -Hlub cp -Lotrzymuję te same wyniki:

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

Ta odpowiedź tutaj opisuje obie opcje jako podobne UNLESS używane w połączeniu z -R. Nie dla mnie. Soft- jako pliki dowiązane stają się kopiami plików, które wskazują na źródło.
 

Pytanie :

Jakie jest właściwe użycie cp -Hi cp -L? Czy to jest oczekiwane zachowanie?


  Moja próba rozwiązania : man cpmówi mi to samo dla obu opcji, ale info cpjest sformułowanie czyni go jeszcze bardziej mylące dla mnie. Może może mi pomóc to trochę rozwiązać:

-H Jeśli argument wiersza poleceń określa dowiązanie symboliczne, skopiuj wskazany plik zamiast samego dowiązania symbolicznego . Jednak skopiować (zachowując swój charakter) dowolny link symboliczny , który jest napotkany przez rekurencyjnego przechodzenia.

Brzmi to dla mnie jak sprzeczność: myślę, że » naturą dowiązania symbolicznego « jest to, że wskazuje gdzieś…

-L, --dereference Podczas kopiowania z nich korzystaj z dowiązań symbolicznych. Dzięki tej opcji cpnie można utworzyć dowiązania symbolicznego. Na przykład dowiązanie symboliczne (do zwykłego pliku) w drzewie źródłowym zostanie skopiowane do zwykłego pliku w drzewie docelowym.

Wiem, że dowiązanie symboliczne nie jest zwykłym plikiem, ale… Przyznaję, że omawia mnie to wyjaśnienie.

erch
źródło
Uruchom info cp, wyszukaj -R. Mówi: Copy directories recursively. Ale testujesz z nie-katalogami. Różnica polega na tym, co znajduje się w katalogach, które kopiujesz, a nie na argumentach wiersza poleceń.
Mikel
@Mikel Próbowałem z kopiowaniem zawartości katalogów i kopiowaniem samych katalogów z treścią i uzyskałem całkiem takie same wyniki. Ponadto: Siedziałem dość długo przed sobą info cpi starałem się zorientować, co właściwie oznacza wybór słów w tej opcji & ndash; i o czym jest ten post. info cp
Publikacja

Odpowiedzi:

55

W przypadku dowiązań symbolicznych narzędzia mają dwie możliwości:

  1. Traktuj dowiązanie symboliczne jako dowiązanie symboliczne („zachowując jego naturę”) lub
  2. Traktuj dowiązanie symboliczne jako typ pliku, na który wskazuje.

Mówienie, że -H„zachowuje swoją naturę” nie jest sprzecznością. Rozważ alternatywę. Jeśli użyjesz -L, wszelkie cpznalezione dowiązania symboliczne zostaną otwarte, a ich zawartość skopiowana do nazwy pliku docelowego. Więc źródłem było dowiązanie symboliczne, ale jego kopia nie jest dowiązaniem symbolicznym. Więc „straciło swoją naturę jako dowiązanie symboliczne”.

Rozważać

$ 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
źródło
Świetna odpowiedź - uwielbiam sposób, w jaki ilustrujesz działanie opcji. Nie dość odpowiada na moje pytanie, które dotyczy kopiowania dowiązań symbolicznych do katalogów rodzeństwa, ale dałeś do zrozumienia, jak mogę zrobić szybki eksperyment, aby się dowiedzieć. 😉
Michael
1
Ach, okazuje się, że tak naprawdę chciałem wiedzieć: superuser.com/a/138594/219388
Michael Scheper
19

Różnica w zachowaniu między -Li -Hpojawia się, gdy -rjest określona. cpnie utworzy dowiązań symbolicznych w podkatalogach, -L -rale zrobi to, jeśli użyjesz -H -r.

Kyle Jones
źródło
cp: opcje -H, -L i -P nie mogą być określone z opcją -r.
3z33etm