サーバーにファイルをscp
したい。ファイルはシンボリックリンクであり、実際に私がしたいのはソースファイルをコピーすることです。とにかく、ソースファイルのパスは手動で追跡する必要はありません。置換できるからです。ソースファイルの絶対パスを取得できれば、sep
でそれを取得できます。どうすればパスを取得できますか?
この行を試してください:
readlink -f `which command`
command
が$PATH
変数、そうでない場合は、知っているパスを指定する必要があります。
Linuxでは、readlink
はシンボリックリンクの内容を読み取り、readlink -f
はシンボリックリンクではないものを見つけるまで、シンボリックリンクからシンボリックリンクへと続きます。
ただし、これはscpには必要ありません。scpは常にシンボリックリンクに従います(-p
が可能な限りファイルの時間とモードを保持することを除いて、メタデータを無視して常にファイルの内容をコピーします)。
Scpで保存できるものと保存できないメタデータに失望している場合は、rsyncを使用することをお勧めします。オプションがない場合、rsyncはメタデータを無視してファイルの内容をコピーします。一般的に使用されるオプション-a
は、園芸品種のすべてのメタデータ(時間、シンボリックリンク、権限、所有権)を保持し、ACLやハードリンクなどのエキゾチックなメタデータを保持するオプションがあります。
コマンドls
、stat
、readlink
を使用します。
ファイル/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
から
Statは次の情報を提供します。
$ stat current
File: `current' -> `/home/user/releases/build/'
...
あなたはどちらかをすることができます
readlink -f `which command`
またはあなたはLinuxで同様のものを得ることができます
stat `which command` | grep File
これをスクリプトに追加する場合は、エラーを調べてください。シンボリックリンクがない場合にエラーメッセージを表示したくない場合は、次のようにします。
readlink -f "`which command`"
私は使うだろう realpath <symlink>
。
おそらく、「ソース」と呼ぶのは、ln
の使用法に応じた「ターゲット」ファイルです:Usage: ln [OPTION]... [-T] TARGET LINK_NAME
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
以下はシンボリックリンクを解決するフルパスを与えるでしょう。
which [symlink] | xargs realpath
readlink -f 'which Java'
が機能しませんでした。
しかし、これはしました:
readlink -f $(which Java)