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
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.
-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)