いくつかのシンボリックリンクを含むディレクトリがあります。
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
は相対リンクを非作業ディレクトリにコピーすることを拒否します私は何をすべきか?
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
はリンク自体をコピーする代わりにコピーするファイルを見つけるために続きます。
Manページが言うように、-P
を使います。
リンクに相対パスが含まれている場合は、リンクをコピーしても相対パスは調整されません。リンクの絶対パスを取得するために、readlink
をスイッチ-f
とともに使用して再帰的にフォローします。例えば:
ln -s $(readlink -f old/dir/oldlink) new/dir/newlink
Ignacio Vazquez-Abramsで述べられているように、相対パスを維持することが必要な場合は、cp
のオプション-P
よりも必要です。
少数がコメントしたように:
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
ほとんどの場合、多数のシンボリックリンクをコピーする必要があるときは、実際にはディレクトリツリーをミラーリングしようとしています。だから私はシンボリックリンクと他のすべてが欲しいのです。
これはほんの少しのシンボリックリンクをコピーするにはやり過ぎですが、実際にツリー全体をコピーしようとしている場合、これは非常に便利です。
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 - )'
繰り返しますが、これはシンボリックリンクをコピーするたびに適切なわけではありませんが、知っておくと非常に便利なコードです。
私は次のようにして非常に大きなディレクトリを複製しました。すべてのシンボリックリンクは保存され、コピーは再帰的に行われ、私はそのプロセスに関する視覚的なフィードバックを得ることができました。
cp -Prv /sourcer_dir/* /target_dir
試してみてください。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)
Ubuntu上でリンクとファイルをディレクトリにコピーする場合
cp --no-dereference --preserve=links
Ignacio Vazquez-Abrams が上で書いたように 、-P
オプションを使用してください。彼が言及しなかったことは、-P
が-R
なしでは効果がないということです。だからあなたは少なくともcp -RP
が必要です。
(このサイトではまだコメントできませんので、別の回答を投稿しました。)
cp -sとcp -Lは特別なコマンドです。あなたの必要条件のために、どれも使わないでください。
例えばaとaを指すシンボリックリンクbを含むディレクトリDIRをコピーする。
必要なのはN/a(= DIR/a)、そしてN/b - > ../ N/aです。そのため、cp -Pオプションを使用して、参照を解除せずにコピーするだけです。これはcpのデフォルトでもあると思います。
他のオプションについてはman cp
またはcp --help
を参照してください。