大量のファイルを別のディレクトリに「インストール」して、ソースファイルのディレクトリ構造をそのまま維持する必要があります。たとえば、./foo/bar/baz.txt
から/var/www/localhost/webroot/
に行く場合、結果は/var/www/localhost/webroot/foo/bar/baz.txt
にしたいとします。 rsync
は--relative
にこの機能を備えていますが、これを行ったとき、シンボリックリンクに適さないことがわかりました。
$ ls -ald /var/www/localhost/webroot/ | grep ^l
lrwxrwxrwx 1 www-data www-data 15 2014-01-03 13:45 media -> ../static/media
lrwxrwxrwx 1 root root 13 2014-02-24 13:47 var -> ../static/var
$ rsync -qrR . /var/www/localhost/webroot/
$ ls -ald /var/www/localhost/webroot/ | grep var
drwxr-xr-x 3 root root 4096 2014-02-24 13:52 /var/www/localhost/webroot/var
シンボリックリンクがシンボリックリンクではなくなったことがわかります–ファイルが間違った場所にコピーされました!
rsync
には--no-implied-dirs
オプションもあります。これは一見、私が望むことをしているように見えますが、notが再帰的なrsyncを行うときに意図したとおりにしか機能しないため、 :
find . -type f -print0 | xargs -0I{} rsync -R --no-implied-dirs {} /var/www/localhost/webroot/
中間シンボリックリンクディレクトリを(rsyncの有無にかかわらず)消去することなく、このファイルのミラーリングを実現する直接的な方法はありますか?
rsync
のオプションを使用-K
(--keep-dirlinks
)。マンページから:
-K, --keep-dirlinks
This option causes the receiving side to treat a
symlink to a directory as though it were a real
directory, but only if it matches a real directory from
the sender. Without this option, the receiver’s
symlink would be deleted and replaced with a real
directory.
For example, suppose you transfer a directory foo that
contains a file file, but foo is a symlink to directory
bar on the receiver. Without --keep-dirlinks, the
receiver deletes symlink foo, recreates it as a
directory, and receives the file into the new
directory. With --keep-dirlinks, the receiver keeps
the symlink and file ends up in bar.
One note of caution: if you use --keep-dirlinks, you
must trust all the symlinks in the copy! If it is
possible for an untrusted user to create their own
symlink to any directory, the user could then (on a
subsequent copy) replace the symlink with a real
directory and affect the content of whatever directory
the symlink references. For backup copies, you are
better off using something like a bind mount instead of
a symlink to modify your receiving hierarchy.
See also --copy-dirlinks for an analogous option for
the sending side.
シンボリックリンクをシンボリックリンクとして保持したかった。そのためには、-lオプションを使用できます。
-l, --links copy symlinks as symlinks
OS Xでフレームワークをコピーしていたので、これは役に立ちました。
使ってください -a
、つまり-l
上記のとおり。しかし、ソースの完全なコピーが必要な場合は、他の重要なオプションも含まれています。
また、manページを理解しているように、-K
は、受信側のシンボリックリンク用です。これはここでは正解とは思わない。
rsync
以外の回答として、tar
ユーティリティはこのタスクを実行できます。パイプの両側でtar
の2つのインスタンスを使用します。最初のインスタンスはディレクトリ構造を使用し、2番目のインスタンスは別の場所に抽出します。コピーのファイル所有権は変更される可能性が高く、許可モードは変更されないままになる可能性があります。
多くの例が存在し、私はこの回答の提案を比較的迅速に見つけました: https://unix.stackexchange.com/a/59108/34251 。
編集
2番目の(より簡潔な?)例: https://unix.stackexchange.com/a/19824/34251 。