2010-05-07 04:36:38 +0000 2010-05-07 04:36:38 +0000
188
188

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

私はいくつかのシンボリックリンクを含むディレクトリを持っています:

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 は適切な動作ではないリンクへのリンクを作成します。

回答 (10)

212
212
212
2010-05-07 05:02:45 +0000
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 はリンク自体をコピーするのではなく、ソースのリンクをたどってコピーするファイルを見つけるために使用しています。

47
47
47
2010-05-07 04:39:24 +0000

manページに書いてあるように、-Pを使ってください。

30
30
30
2010-05-07 05:09:01 +0000

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

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

相対パスを保存することがあなたが望むものであるならば、イグナシオ・バスケス=アブラムスが言ったように、-Pのオプションcpよりも、あなたが必要とするものがあります。

24
24
24
2015-01-27 14:51:13 +0000

数人がコメントしているように:

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
11
11
11
2012-05-15 17:25:32 +0000

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

cp -Prv /sourcer_dir/* /target_dir
11
11
11
2010-05-07 06:03:32 +0000

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

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

このトリックは、ミラーリングされるディレクトリのルートの位置に tar コマンドを配置するためにサブシェルを利用しています。

4
4
4
2011-07-27 13:15:51 +0000

試してみます: 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
3
3
2015-12-01 12:51:43 +0000

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

cp --no-dereference --preserve=links
2
2
2
2019-01-12 17:55:13 +0000

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

(このサイトはまだコメントさせてくれないので、別の回答を投稿しました)

1
1
1
2018-06-26 03:24:57 +0000

cp -s と cp -L は特別なコマンドです。

… 例えば、a を指すシンボリックリンク b と、a を含むディレクトリ DIR をコピーする。 ./DIR/b) にリンクしているので、リンクのディレフェレンシングをして N/a, N/b (DIR/a と同じ)

必要なのは N/a(=DIR/a) と N/b->…/N/a なので、 cp -P オプションを使ってディレフェレンシングをせずにコピーすればいいだけです。これも cp のデフォルトだと思います。

  • -P no-dereference, preserve links -d は -P オプションと -p を組み合わせて preserve=mode,ownership,timestamps にします。 -a は -d オプションと -R を組み合わせて再帰的にディレクトリをコピーします。

関連する質問

6
10
7
5
4