web-dev-qa-db-ja.com

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

いくつかのシンボリックリンクを含むディレクトリがあります。

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は相対リンクを非作業ディレクトリにコピーすることを拒否します

私は何をすべきか?

174
Basilevs
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はリンク自体をコピーする代わりにコピーするファイルを見つけるために続きます。

195
kainosnous

Manページが言うように、-Pを使います。

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

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

Ignacio Vazquez-Abramsで述べられているように、相対パスを維持することが必要な場合は、cpのオプション-Pよりも必要です。

28
mrucci

少数がコメントしたように:

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
23
Juh_

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

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

tarを使用してください。

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

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

このトリックは、tarコマンドをミラーリングするディレクトリのルートに配置するためにサブシェルを利用します。すでにsrcに入っている場合は、それらの1つを(関連するcdコマンドと共に)除外することができます。 /またはdestディレクトリ:

# 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 [email protected] '( cd /path/to/dest ; tar xf - )'

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

10
quack quixote

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

cp -Prv /sourcer_dir/* /target_dir
10
oarevalo

試してみてください。cp -prシンボリックリンク先

[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)

4
ebe0

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

cp --no-dereference --preserve=links
3
Amiramix

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

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

1
1234ru

cp -sとcp -Lは特別なコマンドです。あなたの必要条件のために、どれも使わないでください。

例えば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を組み合わせて、=モード、所有権、タイムスタンプを保持します。
  • -aは、-dオプションと-Rを組み合わせてディレクトリを再帰的にコピーします。

他のオプションについてはman cpまたはcp --helpを参照してください。

1
Atif Hussain