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

command-line cp linux symbolic-link

シンボリックリンクを含むディレクトリを持っています

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 は、動作しないディレクトリへの相対リンクのコピーを拒否します

どうすればいいの?

  198  Basilevs  2010-05-07


ベストアンサー

cp --preserve=links

男のページから

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

個人的には、私は重いコピーのほとんどにcp -avを使っています。そうすれば、再帰的にすべてを保存して、出力を見ることができます。もちろん、これは個人的な好みにすぎません

他のオプションがあなたの期待通りにならなかった理由としては、-sはコピーの代わりにリンクを作り、-Lはリンク自体をコピーするのではなく、コピーするファイルを見つけるためにソース内のリンクをたどっています

221  kainosnous  2010-05-07


manページに書いてある通り、-Pを使ってください。この設定では

-P, --no-dereference
never follow symbolic links in SOURCE

56  Ignacio Vazquez-Abrams  2010-05-07


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

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

もし、相対パスを保存したいのであれば、イグナシオ・バスケス=アブラムスが言ったように、cp-Pオプションが必要です

31  mrucci  2010-05-07


何人かの方がコメントされているように

cp -a

works well.

男の人から

-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

27  Juh_  2015-01-27


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

シンボリックリンクをいくつかコピーするにはやりすぎですが、実際にツリー全体をコピーしようとしている場合には非常に便利です

Use tar.

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

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

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

# 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 - )'

繰り返しになりますが、これはシンボリックリンクをコピーしたいときには毎回適切ではありませんが、知っておくと非常に便利なスニペットです

11  quack quixote  2010-05-07


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

cp -Prv /sourcer_dir/* /target_dir

11  oarevalo  2012-05-15


試してみてください: 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)

4  ebe0  2011-07-27


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

cp --no-dereference --preserve=links

3  Greg  2015-12-01


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

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

2  1234ru  2019-01-12


cp -s, cp -L は特殊なコマンドです。必要に応じて、何も使用しないでください

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

  • 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  2018-06-26


タイトルとURLをコピーしました