GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Finden Sie das Ziel des symbolischen Links über die Befehlszeile heraus

Lösung 1:

Verwenden Sie den -f flag, um die kanonisierte Version zu drucken. Zum Beispiel:

readlink -f /root/Public/myothertextfile.txt

Ab man readlink :

-f, --canonicalize
      canonicalize by following every symlink in every component of the given name recursively; all but the last component must exist

Lösung 2:

readlink ist der gewünschte Befehl. Sie sollten sich die Manpage für den Befehl ansehen. Denn wenn Sie einer Kette von symbolischen Links zur eigentlichen Datei folgen wollen, dann brauchen Sie den Schalter -e oder -f:

$ ln -s foooooo zipzip   # fooooo doesn't actually exist
$ ln -s zipzip zapzap

$ # Follows it, but doesn't let you know the file doesn't actually exist
$ readlink -f zapzap
/home/kbrandt/scrap/foooooo

$ # Follows it, but file not there
$ readlink -e zapzap

$ # Follows it, but just to the next symlink
$ readlink zapzap
zipzip

Lösung 3:

Das funktioniert auch:

ls -l /root/Public/myothertextfile.txt

aber readlink würde für die Verwendung in einem Skript bevorzugt werden, anstatt ls zu parsen .

Lösung 4:

Wenn Sie die Quelle und das Ziel des Links anzeigen möchten, versuchen Sie es mit stat -c%N files* . Z. B.

$ stat -c%N /dev/fd/*
‘/dev/fd/0’ -> ‘/dev/pts/4’
‘/dev/fd/1’ -> ‘/dev/pts/4’

Es ist nicht gut zum Parsen (verwenden Sie readlink dafür), aber es zeigt den Namen und das Ziel des Links, ohne das Durcheinander von ls -l

-c kann --format geschrieben werden und %N bedeutet „Dateiname in Anführungszeichen mit Dereferenzierung bei symbolischem Link“.

Lösung 5:

Die readlink ist eine gute Sache, aber GNU-spezifisch und nicht plattformübergreifend. Früher habe ich plattformübergreifende Skripte für /bin/sh geschrieben , daher würde ich so etwas wie:

verwenden
 ls -l /root/Public/myothertextfile.txt | awk '{print $NF}'

oder:

 ls -l /root/Public/myothertextfile.txt | awk -F"-> " '{print $2}'

Diese müssen jedoch auf verschiedenen Plattformen getestet werden. Ich denke, sie werden funktionieren, bin mir aber bei ls nicht 100 % sicher Ausgabeformat.

Das Ergebnis von ls kann auch innerhalb von bash geparst werden ohne Abhängigkeit von einem externen Befehl wie awk , sed oder perl .

Diese bash_realpath Funktion, löst das endgültige Ziel eines Links auf (link→link→link→final):

bash_realpath() {
  # print the resolved path
  # @params
  # 1: the path to resolve
  # @return
  # >&1: the resolved link path

  local path="${1}"
  while [[ -L ${path} && "$(ls -l "${path}")" =~ -\>\ (.*) ]]
  do
    path="${BASH_REMATCH[1]}"
  done
  echo "${path}"
}

Linux
  1. 5 Befehlszeilen-Tools zum schnellen Auffinden von Dateien unter Linux

  2. So ändern Sie Berechtigungen und Eigentümer über die Befehlszeile

  3. So finden Sie heraus, was ein Linux-Befehl tut

  4. Linux – Wie finde ich die Intel-Architekturfamilie über die Befehlszeile heraus?

  5. Wie kann ich über die Befehlszeile herausfinden, ob httpd ausgeführt wird oder nicht?

So erstellen Sie einen symbolischen Link in Linux mit dem Ln-Befehl

So finden Sie die öffentliche IP-Adresse über die Befehlszeile unter Linux heraus

Linux ln – So erstellen Sie einen symbolischen Link in Linux [Beispiel-Bash-Befehl]

Finden Sie die Befehlszeile?

So finden Sie die IP-Adresse in der Linux-Befehlszeile

Gewusst wie:Linux Allgemein – Grundlegende IPTables über die Befehlszeile