scp
サーバーにファイルを送信したいです。ファイルはシンボリックリンクであり、実際に私が望むのはソースファイルをコピーすることです。
ソースファイルのパスは置き換えられる可能性があるため、手動で追跡したくありません。
ソースファイルを使用できるように絶対パスを取得するにはどうすればよいですかscp
?
答え1
次の行を試してください。
readlink -f `which command`
command
変数に存在する場合、$PATH
そうでない場合は知っているパスを指定する必要があります。
答え2
Linuxでは、readlink
シンボリックリンクの内容を読み、シンボリックリンクではなくエントリがreadlink -f
見つかるまで、シンボリックリンクからシンボリックリンク、シンボリックリンクに追跡します。
しかし、scpにはこれは必要ありません。 scpは常にシンボリックリンクに従います(常にファイルの内容をコピーし、メタデータを無視しますが、-p
可能であればファイルの時間とモードを維持します)。
scpが保存できるメタデータと保存できないメタデータについて不満がある場合は、rsyncを使用することをお勧めします。オプションがない場合、rsyncはメタデータを無視してファイルの内容をコピーします。一般的に使用されるオプションは、-a
すべての一般的なメタデータ(時間、シンボリックリンク、権限、および所有権)を保存し、ACLやハードリンクなどの無関係なメタデータを保存するオプションもあります。
答え3
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
- 使用統計資料
[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’
- 使用リンクを読む
[flying@lempstacker ~]$ readlink /etc/localtime ../usr/share/zoneinfo/Asia/Shanghai [flying@lempstacker ~]$ readlink -f /etc/localtime /usr/share/zoneinfo/Asia/Shanghai
readlink -f
このコマンドが最も適しているようです。
-f パラメータの説明
~からman readlink
:
-f
,--canonicalize
: 指定された名前を持つすべてのコンポーネントのすべてのシンボリックリンクを繰り返し追跡して正規化します。最後のコンポーネントを除くすべてのコンポーネントが存在する必要があります。
答え4
あなたはできます
readlink -f `which command`
あるいは、Linuxでこのようなものを得ることができます
stat `which command` | grep File
これをスクリプトに追加する場合は、エラーがないか確認してください。シンボリックリンクが存在しない場合にエラーメッセージを表示したくない場合は、次のようなものを使用します。
readlink -f "`which command`"