scpにシンボリックリンクの代わりにファイルをコピーさせる方法

scpにシンボリックリンクの代わりにファイルをコピーさせる方法

scpサーバーにファイルを送信したいです。ファイルはシンボリックリンクであり、実際に私が望むのはソースファイルをコピーすることです。

ソースファイルのパスは置き換えられる可能性があるため、手動で追跡したくありません。

ソースファイルを使用できるように絶対パスを取得するにはどうすればよいですかscp

答え1

次の行を試してください。

readlink -f `which command`

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

答え2

Linuxでは、readlinkシンボリックリンクの内容を読み、シンボリックリンクではなくエントリがreadlink -f見つかるまで、シンボリックリンクからシンボリックリンク、シンボリックリンクに追跡します。

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

scpが保存できるメタデータと保存できないメタデータについて不満がある場合は、rsyncを使用することをお勧めします。オプションがない場合、rsyncはメタデータを無視してファイルの内容をコピーします。一般的に使用されるオプションは、-aすべての一般的なメタデータ(時間、シンボリックリンク、権限、および所有権)を保存し、ACLやハードリンクなどの無関係なメタデータを保存するオプションもあります。

答え3

lsstatコマンドの使用を比較し、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`" 

関連情報