Comment get le path complet du file original d'un lien symbolique doux?

Je veux scp un file sur un server. Le file est un lien symbolique, et en fait ce que je veux faire est de copyr le file source. Quoi qu'il en soit, je ne veux pas suivre le path du file source manuellement, car il peut être remplacé. Si je peux get le path absolu du file source, je peux le sep . Comment puis-je avoir le path?

Essayez cette ligne:

 readlink -f `which command` 

Si la command est dans votre variable $PATH , sinon vous devez spécifier le path que vous connaissez.

Sous Linux, readlink lit le contenu d'un lien symbolique, et readlink -f suit des liens symboliques vers des liens symboliques vers des liens symboliques, etc., jusqu'à ce qu'il trouve quelque chose qui ne soit pas un lien symbolique.

Cela n'est pas nécessaire pour scp cependant: scp suit toujours les liens symboliques (il copy toujours le contenu du file, en ignorant les métadonnées sauf que -p conserve les time et les modes de files lorsque cela est possible).

Si vous vous trouvez déçu par ce que les métadonnées scp peuvent et ne peuvent pas préserver, je suggère d'utiliser rsync. Sans option, rsync copy le contenu du file en ignorant les métadonnées. L'option couramment utilisée -a conserve toutes les métadonnées de type jardin (time, liens symboliques, permissions et propriété) et il existe des options pour préserver les métadonnées exotiques comme les lists de contrôle d'access et les liens physiques.

Stat vous donnera cette information:

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

Vous pouvez soit faire

 readlink -f `which command` 

ou vous pouvez get quelque chose de similaire sous Linux avec

 stat `which command` | grep File 

Si vous ajoutez ceci à un script, inspectez l'erreur. Si vous ne voulez pas voir le message d'erreur dans le cas où le lien sym n'est pas là, allez avec quelque chose comme

 readlink -f "`which command`" 

J'utilise la command ls , stat , readlink .

Prenez le file /etc/localtime comme exemple

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

Opération

Utiliser stat

 [flying@lempstacker ~]$ 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: - [flying@lempstacker ~]$ stat -c "%N" /etc/localtime '/etc/localtime' -> '../usr/share/zoneinfo/Asia/Shanghai' 

Utiliser readlink

 [flying@lempstacker ~]$ readlink /etc/localtime ../usr/share/zoneinfo/Asia/Shanghai [flying@lempstacker ~]$ readlink -f /etc/localtime /usr/share/zoneinfo/Asia/Shanghai 

Il semble que cette command readlink -f soit meilleure.

Explication

-f, –canonicalize: canonicaliser en suivant récursivement chaque lien symbolique de chaque composant du nom donné; tout sauf le dernier composant doit exister – De l' man readlink

J'utiliserais realpath <symlink> .

Probablement ce que vous appelez 'source' est le file 'cible' selon l'utilisation de ln : Usage: ln [OPTION]... [-T] TARGET LINK_NAME

readlink -f 'which java' n'a pas fonctionné pour moi.

Mais cela a fait:

 readlink -f $(which java)