MacOSのcp -r -l(再帰的コピーはハードリンクを保持)


12

ファイルへのハードリンクを保持するディレクトリツリーを再帰的にコピーしようとしています。gnu cpを使用すると、これは-lフラグで機能します。その後、cpはディレクトリ構造を再作成しますが、各ファイルの内容をコピーする必要はありません。

これはバックアップの準備段階です。最初に以前のバックアップの安価な(ハードリンクされた)コピーを作成し、次にこのコピーでソースディレクトリをrsyncします。おおよそ:

 cp -r -l yesterdays_backup todays_backup
 rsync -a source_dir todays_backup

残念ながら、OSXのcpは-lフラグをサポートしていません。私の知る限り、cpioは再帰的なコピーをサポートしていません。もう1つの方法はpaxですが、これによりディレクトリ構造全体がコピーされます。

 pax -rw backups/yesterdays_backup backups/todays_backup

変換:

 yesterdays_backup
 |
  \source_dir (...)

に:

 todays_backup
 |
  \backups
          \yesterdays_backup
                            \source_dir(...)

これを行うには簡単で明白な方法があるはずですが、私は現在困惑しています... cpioとpaxの代替手段はありますか?gnu cpをインストールする必要がないようにしたいと思います。

Timemachineは知っていますが、暗号化されたディレクトリを適切に増分バックアップすることはできません。

mac  backup  rsync  cp 

ここで説明するように、cpioとともにfindを使用すると、再帰的なcpioの欠如を回避できます(mikerubel.org/computers/rsync_snapshots/#Incremental)が、非常にエレガントに見えません...

回答:


16

MacPortsからcpをインストールするのは簡単ですが、したくない場合、または移植可能なスクリプトを作成したい場合は、3つのオプションがあります。

rsync

rsync --archive --link-dest=../yesterdays_backup backups/yesterdays_backup\
   backups/todays_backup

cpio

mkdir backups/todays_backup
cd backups/yesterdays_backup
find . -print | cpio -p -al ../todays_backup

パックス

mkdir backups/todays_backup
cd backups/yesterdays_backup
pax -rwl . ../todays_backup

ソースと宛先が異なるディスクにある場合はどうなりますか?rsyncは、宛先で作成されたコピーのソースからのハードリンクを保持しますか?
lpacheco

7

名前がに変更されたGNU コマンドを含むcoreutilsパッケージをMacPortsから簡単にインストールできます。cpgcp

しかし、さらに優れた、少なくともOS X 10.5のバージョンを含むrsyncの新しいバージョンは、最初のcp -alの必要性を排除する--link-destオプションをサポートしています。こちらをご覧ください。-Eオプションも使用して、拡張属性やACLなどをコピーすることをお勧めします。


1

cpioは直接再帰的なコピーをサポートしていませんが、コピーするファイルの正確なリストを標準入力にフィードし、findパイプを使用して再帰的なコピーの効果を得ることができますcpio。これはtar、オプションを指定してGNUを使用することと直接類似しています-T -(つまり、標準入力からバックアップするファイルのリストを読み取ります)。


1

あなたが望むものは、でも達成できると私は信じていますditto yesterdays_backup todays_backup。デフォルトでdittoは、ハードリンク、ACL、および拡張属性を保持する再帰コピーを実行します。


問題は、ディレクトリスコープ全体にハードリンクを作成することを目的とする場合に、コピーが安価にならないことです。dittoはそれらが存在するときにそれらを保持できますが、複製を作成する代わりにリンクするように指示することはできません。
Florenz Kley、2011

ディレクトリのハードリンクを保持するように指示することもできないと思います。manページには、ファイルのハードリンクのみが表示されるとあります
Chris F Carroll

0

ポールの答えの+1。dittoはオプションですが、findと組み合わせて使用​​した場合にのみ-ハードリンクは保持されますが、ディレクトリ内のみが保持されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.