web-dev-qa-db-fra.com

Comment obtenir le chemin complet du fichier d'origine d'un lien symbolique doux?

Je veux scp un fichier sur un serveur. Le fichier est un lien symbolique, et en fait, ce que je veux faire, c'est copier le fichier source. Quoi qu'il en soit, je ne veux pas suivre le chemin du fichier source manuellement, car il peut être remplacé. Si je peux obtenir le chemin absolu du fichier source, je peux sep avec lui. Comment puis-je obtenir le chemin?

103
Eonil

Essayez cette ligne:

readlink -f `which command`

Si command se trouve dans votre $PATH variable, sinon vous devez spécifier le chemin que vous connaissez.

134
daisy

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

Ce n'est cependant pas nécessaire pour scp: scp suit toujours les liens symboliques (il copie toujours le contenu du fichier, en ignorant les métadonnées sauf que -p préserve les heures et les modes des fichiers lorsque cela est possible).

Si vous vous sentez déçu par ce que scp de métadonnées peut et ne peut pas conserver, je suggère d'utiliser rsync. Sans option, rsync copie le contenu du fichier en ignorant les métadonnées. L'option couramment utilisée -a préserve toutes les métadonnées de jardin (heures, liens symboliques, autorisations et propriété), et il existe des options pour préserver les métadonnées exotiques comme les ACL et les liens durs.

J'utilise la commande ls, stat, readlink.

Prendre le fichier /etc/localtime par 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

Utilisation de 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’

Utilisation de 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 commande readlink -f est mieux.

Explication

-f, --canonicalize: canoniser en suivant récursivement chaque lien symbolique dans chaque composant du nom donné; tous les composants sauf le dernier doivent exister —— De man readlink

9
Gorgon

Stat vous donnera ces informations:

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

Vous pouvez soit faire

readlink -f `which command`

ou vous pouvez obtenir 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`" 
5
Alexandre Santos

J'utiliserais realpath <symlink>.

Ce que vous appelez probablement "source" est le fichier "cible" selon l'utilisation de ln: Usage: ln [OPTION]... [-T] TARGET LINK_NAME

3
XavierStuvw

Sur MAC OX, le paramètre "-f" ne fonctionne pas, 'readlink' fonctionne sans aucun paramètre.

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

Ce qui suit donnerait le chemin complet de résolution du lien symbolique.

which [symlink] | xargs realpath
0
KSC

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

Mais cela a fait:

readlink -f $(which Java)
0
NonCreature0714