シンボリックリンクをコピーするには cp -d を使う
ビルドしたVim関係のファイルを ~/.local/binにコピーしようとして
cp * ~/.local/bin
としたら、シンボリックリンクが通常のファイルになってしまいました。以下は ls -l が出力した内容です。
# 元ファイル lrwxrwxrwx (中略) eview -> vim lrwxrwxrwx (中略) evim -> vim lrwxrwxrwx (中略) ex -> vim lrwxrwxrwx (中略) gview -> vim lrwxrwxrwx (中略) gvim -> vim lrwxrwxrwx (中略) gvimdiff -> vim -rwxr-xr-x (中略) gvimtutor lrwxrwxrwx (中略) rgview -> vim lrwxrwxrwx (中略) rgvim -> vim lrwxrwxrwx (中略) rview -> vim lrwxrwxrwx (中略) rvim -> vim lrwxrwxrwx (中略) view -> vim -rwxr-xr-x (中略) vim lrwxrwxrwx (中略) vimdiff -> vim -rwxr-xr-x (中略) vimtutor -rwxr-xr-x (中略) xxd # ~/.local/binにコピーされたファイル -rwxr-xr-x (中略) eview -rwxr-xr-x (中略) evim -rwxr-xr-x (中略) ex -rwxr-xr-x (中略) gview -rwxr-xr-x (中略) gvim -rwxr-xr-x (中略) gvimdiff -rwxr-xr-x (中略) gvimtutor -rwxr-xr-x (中略) rgview -rwxr-xr-x (中略) rgvim -rwxr-xr-x (中略) rview -rwxr-xr-x (中略) rvim -rwxr-xr-x (中略) view -rwxr-xr-x (中略) vim -rwxr-xr-x (中略) vimdiff -rwxr-xr-x (中略) vimtutor -rwxr-xr-x (中略) xxd
ネット情報とmanページによると、cpコマンドに -d オプションを付ければ良さそうです。
cp -d * ~/.local/bin/
としてみたら、以下のようにシンボリックリンクのままコピーされました。
# cp -d を使って ~/.local/binにコピーされたファイル lrwxrwxrwx (中略) eview -> vim lrwxrwxrwx (中略) evim -> vim lrwxrwxrwx (中略) ex -> vim lrwxrwxrwx (中略) gview -> vim lrwxrwxrwx (中略) gvim -> vim lrwxrwxrwx (中略) gvimdiff -> vim -rwxr-xr-x (中略) gvimtutor lrwxrwxrwx (中略) rgview -> vim lrwxrwxrwx (中略) rgvim -> vim lrwxrwxrwx (中略) rview -> vim lrwxrwxrwx (中略) rvim -> vim lrwxrwxrwx (中略) view -> vim -rwxr-xr-x (中略) vim lrwxrwxrwx (中略) vimdiff -> vim -rwxr-xr-x (中略) vimtutor -rwxr-xr-x (中略) xxd
mvコマンドの場合
mvコマンドではオプション無しでシンボリックリンクのままファイル移動ができました。
素朴な疑問
cp -P でも同じことができそうです。cp -P を使ってコピーしてみたところ、シンボリックリンクのままコピーできました。
ただ、manページには
SYNOPSIS cp [OPTION]... [-T] SOURCE DEST cp [OPTION]... SOURCE... DIRECTORY cp [OPTION]... -t DIRECTORY SOURCE... -d same as --no-dereference --preserve=links -P, --no-dereference never follow symbolic links in SOURCE
と書かれています。これを見ると--preserve=linksの有無が違うようです。
info cp
を見てみると
'-d' Copy symbolic links as symbolic links rather than copying the files that they point to, and preserve hard links between source files in the copies. Equivalent to '--no-dereference --preserve=links'. '-P' '--no-dereference' Copy symbolic links as symbolic links rather than copying the files that they point to. This option affects only symbolic links in the source; symbolic links in the destination are always followed if possible. '-p' '--preserve[=ATTRIBUTE_LIST]' Preserve the specified attributes of the original files. If specified, the ATTRIBUTE_LIST must be a comma-separated list of one or more of the following strings: 'mode' (省略) 'ownership' (省略) 'timestamps' (省略) 'links' Preserve in the destination files any links between corresponding source files. Note that with '-L' or '-H', this option can convert symbolic links to hard links. For example, $ mkdir c; : > a; ln -s a b; cp -aH a b c; ls -i1 c 74161745 a 74161745 b Note the inputs: 'b' is a symlink to regular file 'a', yet the files in destination directory, 'c/', are hard-linked. Since '-a' implies '--no-dereference' it would copy the symlink, but the later '-H' tells 'cp' to dereference the command line arguments where it then sees two files with the same inode number. Then the '--preserve=links' option also implied by '-a' will preserve the perceived hard link. Here is a similar example that exercises 'cp''s '-L' option: $ mkdir b c; (cd b; : > a; ln -s a b); cp -aL b c; ls -i1 c/b 74163295 a 74163295 b
とあります。他にシンボリックリンクに関係する記述として以下の文章もありました。
When copying from a symbolic link, 'cp' normally follows the link only when not copying recursively or when '--link' ('-l') is used. This default can be overridden with the '--archive' ('-a'), '-d', '--dereference' ('-L'), '--no-dereference' ('-P'), and '-H' options. If more than one of these options is specified, the last one silently overrides the others. When copying to a symbolic link, 'cp' follows the link only when it refers to an existing regular file. However, when copying to a dangling symbolic link, 'cp' refuses by default, and fails with a diagnostic, since the operation is inherently dangerous. This behavior is contrary to historical practice and to POSIX. Set 'POSIXLY_CORRECT' to make 'cp' attempt to create the target of a dangling destination symlink, in spite of the possible risk. Also, when an option like '--backup' or '--link' acts to rename or remove the destination before copying, 'cp' renames or removes the symbolic link rather than the file it points to.