web-dev-qa-db-ja.com

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

ファイルへのハードリンクを再帰的に保持するディレクトリツリーをコピーしようとしています。 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に代わるものはありますか? gnucpをインストールする必要はありません。

私はTimemachineを知っていますが、暗号化されたディレクトリを段階的に適切にバックアップしません。

12
a2800276

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

pax

mkdir backups/todays_backup
cd backups/yesterdays_backup
pax -rwl . ../todays_backup
16
Paul Wagland

coreutilsパッケージを MacPorts からインストールするのは簡単です。このパッケージには、GNU cpコマンドの名前がgcpに変更されています。

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

7
Ned Deily

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

1

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

1
DR

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

0
Florenz Kley