it-swarm-eu.dev

Jak získat úplnou cestu původního souboru měkkého symbolického odkazu?

Chci scp soubor na server. Soubor je symbolickým odkazem a vlastně to, co chci udělat, je kopírování zdrojového souboru. Každopádně nechci sledovat cestu zdrojového souboru ručně, protože ji lze nahradit. Pokud dokážu získat absolutní cestu ke zdrojovému souboru, mohu s ním sep. Jak mohu získat cestu?

103
Eonil

Vyzkoušejte tento řádek:

readlink -f `which command`

Pokud je command ve vaší proměnné $PATH, Musíte zadat cestu, kterou znáte.

134
daisy

V systému Linux readlink přečte obsah symbolického odkazu a readlink -f sleduje symlinks na symlinks na symlinks atd., dokud nenajde něco, co není symlink.

To však není nutné pro scp: scp vždy následuje symbolické odkazy (vždy kopíruje obsah souboru, ignoruje metadata s výjimkou toho, že -p zachovává časy a režimy souborů, pokud je to možné).

Pokud zjistíte, že jste zklamaní tím, co metadata scp mohou a nemohou zachovat, doporučuji použít rsync. Bez možnosti rsync zkopíruje obsah souboru a ignoruje metadata. Běžně používaná možnost -a zachovává všechna metadata zahradní rozmanitosti (časy, symbolické odkazy, oprávnění a vlastnictví) a existují možnosti zachování exotických metadat, jako jsou ACL a pevné odkazy.

Používám příkaz ls, stat, readlink.

Vezměte soubor /etc/localtime jako příklad

[[email protected] ~]$ ls /etc/localtime 
/etc/localtime
[[email protected] ~]$ ls -l /etc/localtime
lrwxrwxrwx. 1 root root 35 Aug  2 22:41 /etc/localtime -> ../usr/share/zoneinfo/Asia/Shanghai

Úkon

Pomocí stat

[[email protected] ~]$ stat /etc/localtime
  File: ‘/etc/localtime’ -> ‘../usr/share/zoneinfo/Asia/Shanghai’
  Size: 35          Blocks: 0          IO Block: 4096   symbolic link
Device: fd01h/64769d    Inode: 272202388   Links: 1
Access: (0777/lrwxrwxrwx)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2016-11-23 09:00:59.999887800 +0800
Modify: 2016-08-02 22:41:26.090389904 +0800
Change: 2016-08-02 22:41:26.090389904 +0800
 Birth: -
[[email protected] ~]$ stat -c "%N" /etc/localtime
‘/etc/localtime’ -> ‘../usr/share/zoneinfo/Asia/Shanghai’

Pomocí readlink

[[email protected] ~]$ readlink /etc/localtime
../usr/share/zoneinfo/Asia/Shanghai
[[email protected] ~]$ readlink -f /etc/localtime
/usr/share/zoneinfo/Asia/Shanghai

Vypadá to, že tento příkaz readlink -f je lepší.

Vysvětlení

-f, - canonicalize: canonicalize tím, že následuje každý symbolický odkaz v každé komponentě daného jména rekurzivně; musí existovat pouze poslední složka --— Od man readlink

9
Gorgon

Stat vám poskytne tyto informace:

$ stat current
  File: `current' -> `/home/user/releases/build/'
  ...
6
polynomial

Můžete buď

readlink -f `which command`

nebo můžete získat něco podobného v Linuxu

stat `which command` | grep File

Pokud to přidáváte do skriptu, zkontrolujte chybu. Pokud nechcete, aby se chybová zpráva zobrazovala v případě, že tam není symbolický odkaz, jděte na něco jako

readlink -f "`which command`" 
5
Alexandre Santos

Použil bych realpath <symlink>.

Pravděpodobně to, čemu říkáte 'source', je 'cílový' soubor podle použití ln: Usage: ln [OPTION]... [-T] TARGET LINK_NAME

3
XavierStuvw

V systému MAC OX nefunguje parametr "-f", "readlink" funguje bez jakéhokoli parametru.

KZs-MacBook-Pro:bin kz$ readlink -f pip3
readlink: illegal option -- f
usage: readlink [-n] [file ...]

KZs-MacBook-Pro:bin kz$ readlink pip3
../../../Library/Frameworks/Python.framework/Versions/3.7/bin/pip3
0
Xb74Dkjb

Následující text by poskytl úplnou cestu k vyřešení symbolu.

which [symlink] | xargs realpath
0
KSC

readlink -f 'which Java' pro mě nepracoval.

Ale to se stalo:

readlink -f $(which Java)
0
NonCreature0714