web-dev-qa-db-ja.com

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

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

103
Eonil

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

readlink -f `which command`

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

134
daisy

Linuxでは、readlinkはシンボリックリンクの内容を読み取り、readlink -fはシンボリックリンクではないものを見つけるまで、シンボリックリンクからシンボリックリンクへと続きます。

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

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

コマンド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:指定された名前のすべてのコンポーネントのすべてのシンボリックリンクを再帰的にたどることによってcanonicalize。最後のコンポーネントを除くすべてが存在する必要があります-man readlinkから

9
Gorgon

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

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

あなたはどちらかをすることができます

readlink -f `which command`

またはあなたはLinuxで同様のものを得ることができます

stat `which command` | grep File

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

readlink -f "`which command`" 
5

私は使うだろう realpath <symlink>

おそらく、「ソース」と呼ぶのは、lnの使用法に応じた「ターゲット」ファイルです:Usage: ln [OPTION]... [-T] TARGET LINK_NAME

3
XavierStuvw

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
0
Xb74Dkjb

以下はシンボリックリンクを解決するフルパスを与えるでしょう。

which [symlink] | xargs realpath
0
KSC

readlink -f 'which Java'が機能しませんでした。

しかし、これはしました:

readlink -f $(which Java)
0
NonCreature0714