Mam katalog, który zawiera niektóre dowiązania symboliczne:
user@host:include$ find .. -type l -ls
4737414 0 lrwxrwxrwx 1 user group 13 Dec 9 13:47 ../k0607-lsi6/camac -> ../../include
4737415 0 lrwxrwxrwx 1 user group 14 Dec 9 13:49 ../k0607-lsi6/linux -> ../../../linux
4737417 0 lrwxrwxrwx 1 user group 12 Dec 9 13:57 ../k0607-lsi6/dfc -> ../../../dfc
4737419 0 lrwxrwxrwx 1 user group 17 Dec 9 13:57 ../k0607-lsi6/dfcommon -> ../../../dfcommon
4737420 0 lrwxrwxrwx 1 user group 19 Dec 9 13:57 ../k0607-lsi6/dfcommonxx -> ../../../dfcommonxx
4737421 0 lrwxrwxrwx 1 user group 17 Dec 9 13:57 ../k0607-lsi6/dfcompat -> ../../../dfcompat
Muszę je skopiować do bieżącego katalogu. Powstałe linki powinny być niezależne od ich prototypów i prowadzić bezpośrednio do ich obiektów docelowych.
cp -s
tworzy linki do linków, które nie są właściwym zachowaniem.cp -s -L
odmawia kopiowania linków do katalogówcp -s -L -r
odmawia kopiowania względnych łączy do niedziałającego katalogu
Co powinienem zrobić?
linux
command-line
symbolic-link
cp
Basilevs
źródło
źródło
cp -d
wykonałem pracę po mojej stronie.cp -R
na komputerze MacOdpowiedzi:
Ze strony podręcznika:
Osobiście używam
cp -av
do większości moich ciężkich kopii. W ten sposób mogę zachować wszystko - nawet rekurencyjnie - i zobaczyć wyniki. Oczywiście to tylko osobiste preferencje.Jeśli twoje inne opcje nie spełniły oczekiwań,
-s
tworzy link zamiast kopiować i-L
podąża za linkami w źródle, aby znaleźć plik do skopiowania zamiast kopiowania samych linków.źródło
-R
, ponieważ w przeciwnym razie cp pominie katalogi i dowiązania symboliczne do katalogów.cp -a
-a
opcji. Heh, szukałem opcji na stroniecp
niezliczoną ilość razy, ale zawsze musiałem to omijać. Do tej pory używałem-dpr
, ale-a
obejmuje wszystkie te, a także zachowanie kilku innych atrybutów. Gdybym potrzebował tych innych atrybutów, prawdopodobnie ponownie sprawdziłbym tę--preserve
opcję i użył jej-dr --preserve=all
, a dokładnie to, co-a
jest! Przynajmniej wiem teraz --a
jest idealny i od tej pory będę go używać.--preserve=links
nie wystarczyło. Nadal tak powiedziałcp: omitting directory
. Ale-av
działało.Tak jak mówi strona podręcznika, użyj
-P
.źródło
-P
nie działa na katalogach, więc użyłemcp -a
cp -P
przeciwieństwie do najczęściej głosowanej odpowiedzi autorstwa @kainosnous działa dla mnie. Dzięki!Jeśli łącza zawierają ścieżki względne, wówczas skopiowanie łącza nie zmieni ścieżki względnej. Użyj
readlink
przełącznika,-f
aby śledzić rekurencyjnie, aby uzyskać bezwzględną ścieżkę łącza. Na przykład:Jeśli zachowanie ścieżek względnych jest to, co chcesz, niż opcja
-P
zcp
, jak powiedział Ignacio Vazquez-Abrams, jest to, czego potrzebujesz.źródło
/usr/share/dict/words -> /etc/dictionaries-common/words -> /usr/share/dict/british-english
który określa preferowany słownik. Jeśli rekurencyjnie wyrejestrujesz ten łańcuch, powstałe dowiązanie symboliczne zignoruje wszelkie przyszłe zmiany tej preferencji.Jak kilku komentowało:
działa dobrze.
Od mężczyzny:
źródło
Użyłem następujących do zduplikowania naprawdę dużego katalogu. Wszystkie dowiązania symboliczne zostały zachowane, kopia została wykonana rekurencyjnie i mogłem uzyskać wizualne informacje zwrotne na temat procesu:
źródło
Przez większość czasu, kiedy muszę skopiować wiele dowiązań symbolicznych, próbuję dublować drzewo katalogów. Chcę więc dowiązań symbolicznych i wszystkiego innego.
Jest to przesada w przypadku kopiowania tylko kilku dowiązań symbolicznych, ale jeśli faktycznie próbujesz skopiować całe drzewo, może to być bardzo przydatne:
Użyj tar .
tar domyślnie nie rozpoznaje dowiązania symbolicznego, więc dowiązania symboliczne w kopii lustrzanej będą wskazywać te same lokalizacje, co w oryginalnym drzewie.
Ta sztuczka wykorzystuje podpowłoki, aby ustawić komendę tar na pozycję w katalogu głównym katalogu, który ma być dublowany; możesz pominąć jeden z nich (wraz z powiązanym poleceniem cd ), jeśli już jesteś w katalogach src lub dest :
Ponownie, nie jest to właściwe za każdym razem, gdy chcesz skopiować dowiązania symboliczne, ale jest to bardzo przydatny fragment.
źródło
Spróbuj: cp -pr miejsce docelowe dowiązania symbolicznego
System operacyjny - Centos 5 (Linux)
źródło
W systemie Ubuntu podczas kopiowania łączy i plików w katalogu:
źródło
cp -d
jest skrótem od tegocp -a
i drugiecp --preserve=links
robią więcej niż pytanie. Rozumiem, że jest to poprawna odpowiedź dla każdegocp
, kto używa , chociaż tylko pliki (bez katalogów) jak w pytaniu--no-dereference
nie miałyby żadnego efektu.Użyj
-P
opcji, jak napisał Ignacio Vazquez-Abrams . To, o czym nie wspomniał, nie-P
ma żadnego efektu-R
. Więc potrzebujesz przynajmniejcp -RP
.(Witryna nie pozwala mi jeszcze komentować, więc opublikowałem osobną odpowiedź).
źródło
cp -s i cp -L to specjalne polecenia. Do swoich wymagań użyj none.
np. Skopiowanie katalogu DIR zawierającego a i dowiązanie symboliczne b wskazujące na a.
Potrzebujesz tylko N / a (= DIR / a), a N / b -> ../ N / a; więc po prostu skopiuj bez dereferencji, używając opcji cp -P. Wierzę, że jest to również domyślne ustawienie dla cp.
sprawdź
man cp
lubcp --help
więcej opcji.źródło