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?
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.
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
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.
-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
Stat vous donnera ces informations:
$ stat current
File: `current' -> `/home/user/releases/build/'
...
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`"
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
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
Ce qui suit donnerait le chemin complet de résolution du lien symbolique.
which [symlink] | xargs realpath
readlink -f 'which Java'
n'a pas fonctionné pour moi.
Mais cela a fait:
readlink -f $(which Java)