ソフトシンボリックリンクの元のファイルのフルパスを取得する方法は?


99

scpファイルをサーバーに送りたい。ファイルはシンボリックリンクであり、実際にやりたいことはソースファイルのコピーです。とにかく、ソースファイルのパスを手動で追跡したくないのは、それが置き換えられる可能性があるためです。ソースファイルの絶対パスを取得できれば、それを使用できますsep。どうすればパスを取得できますか?


2
ほとんどのscpバージョンはデフォルトでシンボリックリンクに従いますか?あなたは自分のものをチェックし、おそらく自分自身にいくつかの作業を保存すべきです。
jw013

@ jw103知らせてくれてありがとう。知りませんでした。:)
エオニル

2
注:scp -r次のシンボリックリンクを強制します。
エオニル

回答:


129

この行を試してください:

readlink -f `which command`

command$PATH変数にある場合、そうでない場合は、既知のパスを指定する必要があります。


12
-f中間リンクターゲットが存在する限り、存在しない最終ターゲットへのパスを返します... -eこれを回避するために使用します。-e最終ターゲットが存在しない場合はnullを返します。
Peter.O

10
-freadlink: illegal option -- fOSXでエラーが発生しました。削除しても問題ありませんでした。
ヒース国境

2
@HeathBorders OSXでは、homebrew coreutilsがインストールされている場合、greadlink代わりに使用することもできます。
アダム・ゲント

23

Linuxでは、readlinkシンボリックリンクの内容を読み取り、readlink -fシンボリックリンク以外の何かを見つけるまで、シンボリックリンクからシンボリックリンクへのシンボリックリンクをたどります。

ただし、これはscpには必要ありません。scpは常にシンボリックリンクに従います(-p可能な場合、ファイルの時間とモードを保持する以外はメタデータを無視して、常にファイルコンテンツをコピーします)。

メタデータscpが保存できるものとできないものに失望した場合は、rsyncを使用することをお勧めします。オプションを指定しないと、rsyncはメタデータを無視してファイルの内容をコピーします。一般的に使用されるオプション-aは、すべての園芸品種のメタデータ(時間、シンボリックリンク、権限、所有権)を保持し、ACLやハードリンクなどのエキゾチックなメタデータを保持するオプションがあります。


readlinkは、読み取りリンクの単一ステップのみを実行します。たとえば、ubuntuには/ bin / zshがあり、これは/ etc / alternatives / zshにシンボリックリンクされていますが、これは2番目のシンボリックリンクです。最後に、実際のファイルまたはディレクトリパスを取得しません。同じことがstatコマンドにも当てはまります。-fオプションを指定したreadlinkのみがすべての解決を行います。
ズニック

9

私は、コマンドを使用しlsstatreadlink

/etc/localtime例としてファイルを取る

[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

操作

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’

readlinkを使用する

[flying@lempstacker ~]$ readlink /etc/localtime
../usr/share/zoneinfo/Asia/Shanghai
[flying@lempstacker ~]$ readlink -f /etc/localtime
/usr/share/zoneinfo/Asia/Shanghai

そのコマンドreadlink -fが優れているようです。

説明

-f、-canonicalize:指定された名前のすべてのコンポーネントのすべてのシンボリックリンクを再帰的にたどることにより、正規化します。最後のコンポーネントを除くすべてが存在する必要があります-からman readlink


6

Statは次の情報を提供します。

$ stat current
  File: `current' -> `/home/user/releases/build/'
  ...

readlinkは、読み取りリンクの単一ステップのみを実行します。たとえば、ubuntuには/ bin / zshがあり、これは/ etc / alternatives / zshにシンボリックリンクされていますが、これは2番目のシンボリックリンクです。最後に、実際のファイルまたはディレクトリパスを取得しません。同じことがstatコマンドにも当てはまります。-fオプションを指定したreadlinkのみがすべての解決を行います。
ズニック

5

どちらでもできます

readlink -f `which command`

または、Linuxで同様のものを入手できます

stat `which command` | grep File

これをスクリプトに追加する場合は、エラーを調べてください。symリンクが存在しない場合にエラーメッセージを表示したくない場合は、次のようにします

readlink -f "`which command`" 

-fを指定しないstatおよびrealinkは、シングルステップのみを実行します。次に、readlink -fを呼び出します。
ズニック

3

を使用しますrealpath <symlink>

おそらくあなたが「ソース」と呼ぶものは、次の使用法によると「ターゲット」ファイルですlnUsage: ln [OPTION]... [-T] TARGET LINK_NAME


ありがとうこれは魅力のように働いた!Mac OSXで!どこでreadlinkそれをカットしなかった...愚かなマック。lol
JayRizzo

0

readlink -f 'which java' 私にはうまくいきませんでした。

しかし、これは:

readlink -f $(which java)

3
それは.. では`ないのでうまくいきませんでし'たが、$()とにかく良い練習です。
スティーブンラウチ

なぜ投票するのですか?私の答えは受け入れられる代替案であり、コメントが言うように、より良い実践です。
-NonCreature0714

1
反対票を投じるほとんどの人はコメントもしないので、反対票の説明を求めても、反対票を投じた人はすでに去っており、戻ってくる可能性は低いため、説明が得られることはめったにありません。回答から機能しないタイプミスのコードを削除することをお勧めします。あなたがそれをきれいにし、なぜ$()より良い習慣であるかを説明するために時間を取ったなら、私は喜んで賛成するでしょう。
スティーブンラウチ

スティーブンがあなたに説明したように、「ではありません」。でカプセル化する必要がありますがcommand、これは非推奨です。カプセル化$($(command))ははるかに簡単で、特別なエスケープを必要としないため、$()を使用する方が適切です。それが好ましいです。最初の例では、通常のアポストロフィを使用しましたが、readlinkは名前にスペースを含む「which java」という名前のファイルを見つけようとしています。ただし、javaバイナリ実行可能パスを見つけるために、引数javaを使用してコマンドを呼び出します。
ズニック

0

MAC OXでは、「-f」パラメーターは機能せず、「readlink」はパラメーターなしで機能します。

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.