シンボリックリンクをコピーする方法は?


180

シンボリックリンクを含むディレクトリがあります。

user@host:include$ find .. -type l -ls
4737414    0 lrwxrwxrwx   1 user group       13 Dec  9 13:47 ../k0607-lsi6/camac -> ../../include
4737415    0 lrwxrwxrwx   1 user group       14 Dec  9 13:49 ../k0607-lsi6/linux -> ../../../linux
4737417    0 lrwxrwxrwx   1 user group       12 Dec  9 13:57 ../k0607-lsi6/dfc -> ../../../dfc
4737419    0 lrwxrwxrwx   1 user group       17 Dec  9 13:57 ../k0607-lsi6/dfcommon -> ../../../dfcommon
4737420    0 lrwxrwxrwx   1 user group       19 Dec  9 13:57 ../k0607-lsi6/dfcommonxx -> ../../../dfcommonxx
4737421    0 lrwxrwxrwx   1 user group       17 Dec  9 13:57 ../k0607-lsi6/dfcompat -> ../../../dfcompat

それらを現在のディレクトリにコピーする必要があります。結果のリンクは、プロトタイプから独立しており、ターゲットオブジェクトに直接つながる必要があります。

  • cp -s 適切な動作ではないリンクへのリンクを作成します。
  • cp -s -L ディレクトリへのリンクのコピーを拒否します
  • cp -s -L -r 相対リンクを非稼働ディレクトリにコピーすることを拒否します

私は何をすべきか?


10
cp -d私の側で仕事をしました。
m-ric 14年

2
cp -RMacで
ミルコ

回答:


201
cp --preserve=links

manページから:

   --preserve[=ATTR_LIST]
          preserve  the   specified   attributes   (default:   mode,owner-
          ship,timestamps),  if  possible  additional attributes: context,
          links, xattr, all

個人的には、私cp -av は大部分のコピーに使用しています。そうすれば、すべてを(再帰的にも)保存して、出力を確認できます。もちろん、それは個人的な好みです。

あなたの他のオプションは、あなたが期待したものやらなかった理由としては、-sリンクになり代わりのコピーをして-L、リンク自身をコピーするのではなく、コピーするファイルを検索し、ソース内のリンクをたどります。


3
を追加する必要が-Rある場合があります。そうしないと、cpはディレクトリとディレクトリへのシンボリックリンクをスキップします。
オリビエ 'オルバウム'シェラー

8
私はredhatでこれを試しましたが、うまくいきません
Mansuro

41
Macで?使用cp -a
スティーブタウバー

11
-aオプションの+1 。へー、私はcpのマンページで何度もオプションを調べてきましたが、私は常にこのページをざっと目撃したに違いありません。私はこれまでを使用-dprしていました-aが、それらすべてをカバーし、さらに他のいくつかの属性を保持しています。私はこれらのその他の属性を必要としていると思いなら、私はおそらく見上げているだろう--preserve、再びオプションを使用して-dr --preserve=all、正確に何である、-aあります!少なくとも今はわかっています。-a完璧であり、これがこれから使用するものです。
ジェームズヘイ14

3
これはCygwinでは機能しませんでした。--preserve=links十分ではありませんでした。まだ言ったcp: omitting directory。しかし、-av働いた。
クロエ

44

マニュアルページにあるように、を使用してください-P


8
Mac上-Pのディレクトリ上では動作しませんので、私は使用cp -a
スティーブ・タウバーに

4
おかげで、私はあなたの答えを1年で3回見ました。覚えていないようです!
シッダールタ

これは機能しますが、私のmanページには「-Pは決してSOURCEのシンボリックリンクをたどらない」と書かれています。(それは-Rとの組み合わせで動作するようにそれが聞こえる「に従うことはありません」)
RM

これcp -Pは、私にとっては@kainosnous作品による上位投票の回答とは異なります。ありがとう!
-tommy.carstensen

Redhatで動作します。受け入れられた応答は機能しません!
ファイバー

29

リンクに相対パスが含まれている場合、リンクをコピーしても相対パスは調整されません。リンクの絶対パスを取得するreadlinkには、スイッチで-f再帰的にたどります。例えば:

ln -s $(readlink -f old/dir/oldlink) new/dir/newlink

相対パスを維持することはあなたが望むものである場合は、オプションより-Pcpイグナシオバスケス-エイブラムスで言ったように、何が必要です。


1
あなたがやろうとしているのがシンボリックリンクを絶対リンクから相対リンクに変換することだけなら、再帰的に逆参照するのは悪い考えかもしれません。ここでは再帰は必要ありません。また、場合によっては連鎖シンボリックリンクが存在することもあります。シンボリックリンクは、多くの場合、選択肢または構成オプションを指定するために使用されます。たとえば、私のシステムには/usr/share/dict/words -> /etc/dictionaries-common/words -> /usr/share/dict/british-english、優先辞書を指定するシンボリックリンクチェーンがあります。このチェーンを再帰的に逆参照すると、結果のシンボリックリンクは、この設定への今後の変更を無視します。
ジェームズヘイ14

24

いくつかのコメントがあるように:

cp -a 

うまくいきます。

男から:

-a    same as -dR --preserve=all

-R    copy directories recursively
-d    same as --no-dereference --preserve=links
--no-dereference   never follow symbolic links in SOURCE

3
...ただし、どのシンボリックリンクも相対パスにない場合のみ。
マイケルシェパー

11

以下を使用して、非常に大きなディレクトリを複製しました。シンボリックリンクはすべて保持され、コピーは再帰的に行われ、プロセスの視覚的なフィードバックを得ることができました。

cp -Prv /sourcer_dir/* /target_dir

10

ほとんどの場合、多くのシンボリックリンクをコピーする必要があるとき、実際にはディレクトリツリーをミラーリングしようとしています。だから私はシンボリックリンクと他のすべてが欲しい。

これは、ほんの数個のシンボリックリンクをコピーするのはやり過ぎですが、実際にツリー全体をコピーしようとしている場合、これは非常に便利です。

tarを使用します。

user@host:/cwd$ ( cd /path/to/src ; tar cf - . ) | ( cd /path/to/dest ; tar xf - )

tarはデフォルトではシンボリックリンクを解決しないため、ミラーコピーのシンボリックリンクは元のツリーのシンボリックリンクと同じ場所を指します。

このトリックは、サブシェルを使用して、ミラー化するディレクトリのルートにあるtarコマンドを取得します。すでにsrcまたはdestディレクトリにいる場合は、それらの1つを(関連するcdコマンドとともに)除外できます。

# already in src?
user@host:/src$ tar cf - . | ( cd /path/to/dest ; tar xf - )

# already in dest?
user@host:/dest$ ( cd /path/to/src ; tar cf - . ) | tar xf - 

# just need src/foo?
# this result will be a mirror copy at dest/foo 
user@host:/src$ tar cf - foo | ( cd /path/to/dest ; tar xf - )

# mirror to another system?
user@host:/src$ tar cf - . | ssh user@example.com '( cd /path/to/dest ; tar xf - )'

繰り返しますが、これはシンボリックリンクをコピーするたびに適しているわけではありませんが、知っておくと便利なスニペットです。


1
タールは、私の経験では、CPよりも間違いなく、より移植性がある
明るいドン

4

試してください:cp -pr symlink destination

[root@station1 temp]# ls -l
total 8
-rw-r--r-- 1 root root  0 Jul 27 18:40 abc
lrwxrwxrwx 1 root root 13 Jul 27 18:41 abc.link1 -> /tmp/temp/abc
[root@station1 temp]# cp -rp /tmp/temp/abc.link1 /tmp/temp/abc.link2
[root@station1 temp]# ls -l
total 12
-rw-r--r-- 1 root root  0 Jul 27 18:40 abc
lrwxrwxrwx 1 root root 13 Jul 27 18:41 abc.link1 -> /tmp/temp/abc
lrwxrwxrwx 1 root root 13 Jul 27 18:42 abc.link2 -> /tmp/temp/abc
[root@station1 temp]# 

OS-Centos 5(Linux)


3

Ubuntuでディレクトリ内のリンクとファイルをコピーする場合:

cp --no-dereference --preserve=links

5
cp -dこれの省略形です
-hunse

1
私は両方だと思うcp -acp --preserve=links質問が求めている以上のことを行います。私が理解しているように、これはを使用している人にとって正しい答えですcp。ただし、質問のようにファイルのみ(ディレクトリなし)を使用し--no-dereferenceても効果はありません。
palswim

2

-PIgnacio Vazquez-Abrams が上記で書いたように、オプションを使用します。彼が言及しなかったことは-Pなしでは効果がない-R。だから、少なくとも必要cp -RPです。

(このサイトではまだコメントできませんので、別の回答を投稿しました。)


古いsolarisボックスでは、cpは-dをサポートしていません。cp -rPは私のために働きました。(-Rと-rの差分を確認してください。-rは私のために機能します)。
スピオター

1

cp -sおよびcp -Lは特別なコマンドです。要件には、noneを使用します。

たとえば、aとaを指すシンボリックリンクbを含むディレクトリDIRをコピーします。

  • cp -s DIR / * N /は、コピーの代わりにシンボリックリンクを作成します。N/ a-> ../ DIR / a(リンク)およびN / b->(../ DIR / b)はリンクへのリンクです
  • cp -L DIR / * N /リンクの参照解除を伴うコピー、N / a、N / b(DIR / aと同じ)

必要なのはN / a(= DIR / a)、およびN / b-> ../ N / a;です。そのため、cp -Pオプションを使用して、参照解除せずにコピーするだけです。これはcpのデフォルトでもあると思います。

  • -P参照解除、リンクを保持
  • -dは、-Pオプションと-pを組み合わせて、preserve = mode、ownership、timestampsを保持します
  • -aは、-dオプションと-Rを組み合わせて、ディレクトリを再帰的にコピーします

参照man cpまたはcp --helpその他のオプションについて。

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