Ich möchte scp
eine Datei auf einen Server. Die Datei ist ein symbolischer Link, und eigentlich möchte ich die Quelldatei kopieren. Auf jeden Fall möchte ich den Pfad der Quelldatei nicht manuell verfolgen, da er ersetzt werden kann. Wenn ich den absoluten Pfad der Quelldatei erhalten kann, kann ich das sep
damit tun. Wie komme ich zum Pfad?
99
scp
Versionen folgen standardmäßig Symlinks, nicht wahr? Sie sollten Ihre überprüfen und sich vielleicht etwas Arbeit sparen.scp -r
Erzwingt das Folgen von Symlinks.Antworten:
Versuchen Sie diese Zeile:
Wenn
command
in Ihrer$PATH
Variablen enthalten ist, müssen Sie den Pfad angeben, den Sie kennen.quelle
-f
gibt einen Pfad zu einem nicht existierenden Endziel zurück, solange die Zwischenverbindungsziele existieren ... Verwenden Sie-e
diese Option , um dies zu vermeiden, d. h.-e
Gibt null zurück, wenn das endgültige Ziel nicht existiert.-f
fehler mitreadlink: illegal option -- f
in OSX. Das Entfernen hat gut funktioniert.greadlink
stattdessen auch verwenden .readlink
Liest unter Linux den Inhalt einesreadlink -f
Symlinks und folgt Symlinks zu Symlinks zu Symlinks usw., bis etwas gefunden wird, das kein Symlink ist.Dies ist für scp jedoch nicht erforderlich: scp folgt immer Symlinks (kopiert immer den Dateiinhalt und ignoriert Metadaten, außer dass
-p
Dateizeiten und -modi beibehalten werden, wenn dies möglich ist).Wenn Sie enttäuscht sind, welche Metadaten scp beibehalten kann und welche nicht, empfehle ich die Verwendung von rsync. Ohne diese Option kopiert rsync den Dateiinhalt und ignoriert die Metadaten. Bei der häufig verwendeten Option werden
-a
alle Metadaten der Gartensorte (Zeiten, symbolische Verknüpfungen, Berechtigungen und Eigentumsrechte) beibehalten, und es gibt Optionen zum Beibehalten exotischer Metadaten wie ACLs und fester Verknüpfungen.quelle
Ich benutze Befehl
ls
,stat
,readlink
.Nehmen Sie die Datei
/etc/localtime
als BeispielBetrieb
Mit stat
Mit Readlink
Dieser Befehl scheint
readlink -f
besser zu sein.Erläuterung
quelle
Stat gibt Ihnen diese Informationen:
quelle
Sie können entweder tun
oder Sie können etwas Ähnliches in Linux mit bekommen
Wenn Sie dies zu einem Skript hinzufügen, überprüfen Sie den Fehler. Wenn Sie die Fehlermeldung nicht sehen möchten, wenn der Sym-Link nicht vorhanden ist, gehen Sie zu etwas wie
quelle
Ich würde verwenden
realpath <symlink>
.Wahrscheinlich ist das, was Sie als "Quelle" bezeichnen, die "Zieldatei" gemäß der Verwendung von
ln
:Usage: ln [OPTION]... [-T] TARGET LINK_NAME
quelle
readlink
hat es nicht geschnitten ... dummer mac. lolreadlink -f 'which java'
hat bei mir nicht funktioniert.Aber das tat:
quelle
`
nicht ist'
.. aber es$()
ist sowieso besser zu üben.$()
besser ist.command
, aber dies ist veraltet. Die Verwendung von $ () ist besser, da die Kapselung von $ ($ (Befehl)) viel einfacher ist und kein spezielles Escapezeichen erfordert. Dann ist es bevorzugt. In Ihrem ersten Beispiel haben Sie den üblichen Apostroph verwendet und readlink versucht, eine Datei mit dem Namen 'which java' mit einem Leerzeichen im Namen zu finden. Aber Ihre Absicht ist es, den Befehl which mit dem Argument java aufzurufen, um den binären ausführbaren Pfad von java zu finden.Unter MAC OX funktioniert der Parameter "-f" nicht, "readlink" funktioniert ohne Parameter.
quelle