Dites que je crée un lien symbolique:
ln -s /root/Public/mytextfile.txt /root/Public/myothertextfile.txt
Y at-il un moyen de voir ce que la cible de myothertextfile.txt
utilise la ligne de commande?
Dites que je crée un lien symbolique:
ln -s /root/Public/mytextfile.txt /root/Public/myothertextfile.txt
Y at-il un moyen de voir ce que la cible de myothertextfile.txt
utilise la ligne de commande?
Utilisez le -f
drapeau pour imprimer la version canonisée. Par exemple:
readlink -f /root/Public/myothertextfile.txt
De man readlink
:
-f, --canonicalize
canonicalize by following every symlink in every component of the given name recursively; all but the last component must exist
readlink -f
.brew install coreutils
. Cela installe les versions de base des commandes gnu avec le préfixeg
, c'estgreadlink -f somefile
Ubuntu 18.04.1 LTS (Bionic Beaver)
les pages de manuel de readlink, une note indiquant "Remarque: realpath (1) est la commande à utiliser de préférence pour la fonctionnalité de canonisation".readlink est la commande que vous voulez. Vous devriez regarder la page de manuel pour la commande. Parce que si vous voulez suivre une chaîne de liens symboliques vers le fichier réel, vous avez besoin du commutateur -e ou -f:
la source
Cela fonctionnera également:
mais
readlink
serait préférable pour une utilisation dans un script plutôt que l'analysels
.la source
Si vous souhaitez afficher la source et la destination du lien, essayez
stat -c%N files*
. Par exempleCe n’est pas bon pour l’analyse (à utiliser
readlink
pour ça), mais il montre le nom du lien et la destination, sans le fouillis dels -l
-c
peut être écrit--format
et%N
signifie “nom de fichier cité avec déréférence si lien symbolique”.la source
C'est
readlink
une bonne chose, mais spécifique à GNU et non multi-plateforme. J'avais l'habitude d'écrire des scripts inter-plateformes pour/bin/sh
, donc j'utiliserais quelque chose comme:ou:
mais ceux-ci doivent être testés sur différentes plates-formes. Je pense qu'ils fonctionneront, mais ne sont pas sûrs à 100% du
ls
format de sortie.Le résultat de
ls
peut également être analysé à l'intérieurbash
sans dépendre d'une commande externe telle queawk
,sed
ouperl
.Cette
bash_realpath
fonction résout la destination finale d'un lien (lien → lien → lien → final):la source
Si vous ne pouvez pas utiliser
readlink
, alors l'analyse du résultat dels -l
pourrait être faite comme ceci.Le résultat normal serait:
Nous voulons donc tout remplacer avant "->" et la flèche incluse. Nous pourrions utiliser
sed
pour cela:la source
La question n'est pas assez précise pour donner une réponse simple comme celle de brian-brazil:
déréférencera chaque lien symbolique impliqué dans la construction de chemin vers la cible finale située derrière
some_path
.Mais un niveau de liens symboliques en cascade n'est qu'un cas particulier parmi d'autres dans un système, le cas général étant N niveaux de liens symboliques en cascade. Regardez ce qui suit sur mon système:
rwhich
est ma propre implémentation récursivewhich
qui affiche tous les liens symboliques en cascade intermédiaires (to stderr) vers la cible finale (to stdout).Alors si je veux savoir ce qui est:
la cible de symlink / usr / bin / emacs **, la réponse évidente est la réponse
/etc/alternatives/emacs
renvoyée par:la cible finale derrière les liens symboliques en cascade / usr / bin / emacs, la réponse doit être
/usr/bin/emacs24-x
renvoyée par:la source
ll
ouls -l
devrait lister les éléments du répertoire, y compris votre lien symbolique et sa ciblecd -P /root/Public/myothertextfile.txt
(dans votre cas) devrait indiquer le chemin d'originela source
Si vous trouvez la cible de tous les liens dans un dossier et son sous-dossier, utilisez la
find . -type l -ls
commande avec le type de lien comme suit:Si vous voulez la cible d'un seul, alors
ls -l
devrait fonctionner:la source