はじめに (対象読者・この記事でわかること)

この記事は、macOS/Linuxで細かなアクセス権限を管理しているシステム管理者や、開発環境のバックアップを取りたいエンジニアを対象にしています。
この記事を読むと、Finderや通常のcpコマンドでは失われがちな「ACL(アクセスコントロールリスト)」を保持したまま、ファイル・ディレクトリをコピーする方法がわかります。さらに、cp/rsyncの違いやmacOS特有のメタデータ(拡張属性)も一緒に守るコツも紹介します。

前提知識

この記事を読み進める上で、以下の知識があるとスムーズです。

  • Unixパーミッション(chmod/chown)の基本的な知識
  • ターミナルでcp/rsyncコマンドを打ったことがある
  • ACLの概念をぼんやりと知っている(ls -le+マークがついている状態)

ACLってなぜ保持されると嬉しいの?

ACL(Access Control List)は、読み書き実行の3桁だけでは表現しきれない、細かなアクセス権限をファイルやディレクトリに付与する仕組みです。
たとえば、「特定のユーザには読み取りのみ、別のグループには書き込みも許可」といった運用ができます。
ところが、Finder でのドラッグ&ドロップや、素のcpコマンドではACLが 黙って消えてしまうため、バックアップをリストアした途端にアプリが起動できなくなる、開発環境が動かなくなる、といった悲劇が起こります。
ACLを保持したままコピーできれば、本番環境のミラーをローカルに持ってきてデバッグしたり、新しいMacに開発環境を丸ごと移行したり、という運用が安全に行えます。

具体的な手順とコマンドの落とし穴

macOSでACLを確認する

まず現状を把握しましょう。コピー元のディレクトリで以下を実行します。

Bash
# ACL付きファイルを検出 ls -le # 例: -rw-r--r--+ 1 kousukei staff 0 6 24 09:00 config.plist # ↑ この + がACLの印

さらにmacOSなら拡張属性(@)も同時に確認できます。

Bash
# 拡張属性も一緒に表示 ls -l@e

Step1: cp でも ACL は保持できる(ただしオプションが必要)

古い記事には「cpはACLに対応していない」と書かれていることがありますが、GNU coreutils 8.32 以降・macOS 11以降なら--preserve=mode,ownership,acl,xattrで保持できます。

Bash
# 推奨オプション一式(macOS 13以降) cp -R --preserve=mode,ownership,acl,xattr src/ dst/ # 短縮形(mode/ownershipはデフォルトで保持されるため) cp -a src/ dst/ # -a は -R --preserve=all と同義

ポイント: macOSのデフォルトcpはGNU版ではないため、古いmacOS(10.15以前)では-aでもACLが落ちます。
その場合はHomebrewでbrew install coreutilsし、gcp -aを使いましょう。

Step2: rsync ならバージョンを気にせず確実にACLをコピーする

rsync 3.2以降なら、-A(ACL)、-X(拡張属性)オプションが使えます。

Bash
# 最新rsync(3.2.7以降)なら rsync -aAXVH src/ dst/ # 古いrsync(macOS標準の2.6.9など)でも-Eが使える rsync -EHav src/ dst/ # -E は macOS用でACL+拡張属性を含む

-H(ハードリンクを保持)と-V(進行状況表示)も含めておくと、大容量コピー時に安心です。

ハマった点:「コピー先のファイルシステムがACL非対応」で黙って失敗する

NASやWindowsフォーマットの外付けSSD(exFAT/FAT32)にコピーすると、rsyncは0コードで終了してもACLを落としてしまいます
これは「ファイルシステムがACLをサポートしていない」ためで、エラーが出ないので気づきにくいのが怖いところです。

解決策:コピー前にACLをダンプしておく

Bash
# コピー前にACLをテキストで保存 find src -exec ls -lde {} \; > acl_backup.txt # リストア時に手動で戻す(必要に応じて) while IFS= read -r line; do file=$(echo "$line" | awk '{print $NF}') # 省略: acl_from_textで復元するスクリプト done < acl_backup.txt

さらに、ZFS/Btrfs/APFSなどACL対応のボリュームをコピー先に選ぶか、macOSなら「ディスクユーティリティ」で「フォーマット:Mac OS 拡張(ジャーナリズム)」を選んでおけば安心です。

補足:Finderで「エイリアター」ではなく「コピー」してもACLは保持されない

Finder の「オプションキー」を押しながらの「コピー」でも、ACLは保持されません
「情報を見る」で権限をノッチで変更しているだけの場合はACLではないため、ターミナルでls -leを叩いて+マークがあるかを必ず確認しましょう。

まとめ

本記事では、ACLを保持したままmacOS/Linuxでファイルをコピーする方法を紹介しました。

  • cp -a / rsync -aAX でほぼ確実にACLをコピーできる(ただしバージョン注意)
  • コピー先のファイルシステムがACL対応か事前に確認する
  • 念のためACLをテキストダンプしておけば、万が一失われてもリストアできる

この記事を通して、バックアップや環境移行で「なぜか権限が効かない!」という事故を防げるはずです。
次回は、LinuxでNFSマウントしたボリュームに対してACLを設定する際の「マスク」機能と、setfacl/getfaclの実践的な運用例を紹介する予定です。

参考資料