Je veux scp
un fichier sur un serveur. Le fichier est un lien symbolique et ce que je veux réellement 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 le pourrai sep
. Comment puis-je obtenir le chemin?
99
scp
versions suivent des liens symboliques par défaut, n'est-ce pas? Vous devriez vérifier le vôtre et peut-être vous épargner du travail.scp -r
oblige à suivre les liens symboliques.Réponses:
Essayez cette ligne:
Si
command
est dans votre$PATH
variable, sinon vous devez spécifier le chemin que vous connaissez.la source
-f
retournera un chemin vers une cible finale inexistante, tant que les cibles de liens intermédiaires existent ... Utilisez-e
pour éviter cela, c'est-à-dire.-e
retournera null si la cible finale n'existe pas.-f
errored avecreadlink: illegal option -- f
dans OSX. Le retirer a bien fonctionné.greadlink
place.Sous Linux,
readlink
lit le contenu d'un lien symbolique etreadlink -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.Cela 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
les durées et les modes du fichier sont préservés lorsque cela est possible).Si vous êtes 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 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 variétés de jardins (heures, liens symboliques, autorisations et droits de propriété), et il existe des options permettant de préserver les métadonnées exotiques telles que les ACL et les liens physiques.la source
J'utilise la commande
ls
,stat
,readlink
.Prenez le fichier
/etc/localtime
comme exempleOpération
En utilisant stat
Utiliser readlink
Il semble que cette commande
readlink -f
est meilleure.Explication
la source
Stat vous donnera ces informations:
la source
Vous pouvez soit faire
ou vous pouvez obtenir quelque chose de similaire dans Linux avec
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
la source
Je voudrais utiliser
realpath <symlink>
.Probablement ce que vous appelez 'source' est le fichier 'cible' en fonction de l'utilisation de
ln
:Usage: ln [OPTION]... [-T] TARGET LINK_NAME
la source
readlink
ne l'a pas coupé ... stupide mac. lolreadlink -f 'which java'
n'a pas fonctionné pour moi.Mais cela a:
la source
`
pas'
.. mais$()
c'est de toute façon une meilleure pratique.$()
est une meilleure pratique.command
, mais c'est obsolète. L'utilisation de $ () est préférable, car l'encapsulation $ ($ (commande)) est beaucoup plus facile et ne nécessite pas d'échappement spécial. Alors c'est préféré. Dans votre premier exemple, vous utilisiez l'apostrophe habituelle, puis readlink essayait de trouver le fichier nommé 'which java' avec un espace dans son nom. Mais vous avez l’intention d’appeler la commande qui, avec l’argument java, vous permet de trouver le chemin d’exécutable binaire java.Sur MAC OX, le paramètre "-f" ne fonctionne pas, "readlink" fonctionne sans paramètre.
la source