Chcę scp
plik na serwer. Plik jest dowiązaniem symbolicznym, a tak naprawdę to, co chcę zrobić, to skopiować plik źródłowy. W każdym razie nie chcę ręcznie śledzić ścieżki pliku źródłowego, ponieważ można go zastąpić. Jeśli mogę uzyskać ścieżkę bezwzględną do pliku źródłowego, mogę to sep
zrobić. Jak mogę uzyskać ścieżkę?
99
scp
wersji domyślnie korzysta z dowiązań symbolicznych, prawda? Powinieneś sprawdzić swoją i być może zaoszczędzić trochę pracy.scp -r
wymusza podążanie za dowiązaniami symbolicznymi.Odpowiedzi:
Wypróbuj tę linię:
Jeśli
command
znajduje się w$PATH
zmiennej, w przeciwnym razie musisz podać ścieżkę, którą znasz.źródło
-f
zwróci ścieżkę do nieistniejącego celu końcowego, o ile istnieją pośrednie cele docelowe ... Użyj,-e
aby tego uniknąć, tj.-e
zwróci null, jeśli ostateczny cel nie istnieje.-f
błędnie zreadlink: illegal option -- f
w OSX. Usunięcie działało dobrze.greadlink
zamiast tego.Pod Linuksem
readlink
odczytuje zawartość dowiązania symbolicznego ireadlink -f
podąża za dowiązaniami symbolicznymi do dowiązań symbolicznych itp., Aż znajdzie coś, co nie jest dowiązaniem symbolicznym.Nie jest to jednak konieczne w przypadku scp: scp zawsze podąża za dowiązaniami symbolicznymi (zawsze kopiuje zawartość pliku, ignorując metadane, z wyjątkiem tego, że
-p
zachowuje czasy i tryby plików, jeśli to możliwe).Jeśli jesteś rozczarowany tym, co metadane scp może, a czego nie może zachować, sugeruję użycie rsync. Bez opcji rsync kopiuje zawartość pliku ignorując metadane. Często używana opcja
-a
zachowuje wszystkie metadane z różnych odmian ogrodu (czasy, dowiązania symboliczne, uprawnienia i własność), a istnieją opcje zachowania egzotycznych metadanych, takich jak listy ACL i twarde linki.źródło
Używam polecenia
ls
,stat
,readlink
.Weź plik
/etc/localtime
jako przykładOperacja
Korzystanie ze statystyki
Korzystanie z readlink
Wygląda na to, że
readlink -f
to polecenie jest lepsze.Wyjaśnienie
źródło
Stat poda następujące informacje:
źródło
Możesz albo
lub możesz uzyskać coś podobnego w Linuksie
Jeśli dodajesz to do skryptu, sprawdź błąd. Jeśli nie chcesz wyświetlać komunikatu o błędzie w przypadku, gdy nie ma łącza sym, wybierz coś takiego
źródło
Chciałbym użyć
realpath <symlink>
.Prawdopodobnie to, co nazywacie „źródłem”, to plik „docelowy”, zgodnie z zastosowaniem
ln
:Usage: ln [OPTION]... [-T] TARGET LINK_NAME
źródło
readlink
go nie wyciąłem ... głupi Mac. lolreadlink -f 'which java'
nie działało dla mnie.Ale to zrobiło:
źródło
`
nie'
.. ale$()
jest lepsza praktyka jakikolwiek.$()
lepsza praktyka.command
, ale to jest przestarzałe. użycie $ () jest lepsze, ponieważ enkapsulacja $ ($ (polecenie)) jest znacznie łatwiejsza i nie wymaga specjalnego ucieczki. To jest preferowane. W pierwszym przykładzie użyłeś zwykłego apostrofu, a następnie readlink próbuje znaleźć plik o nazwie „która java” ze spacją w nazwie. Ale twoją intencją jest polecenie wywołania, które z argumentem java, w celu znalezienia binarnej ścieżki wykonywalnej java.W MAC OX parametr „-f” nie działa, „readlink” działa bez żadnego parametru.
źródło