所有者と権限をそのままにしてフォルダーをコピーするにはどうすればよいですか?


379

そこで、次のようにホームドライブを外部ドライブにコピーしてバックアップします。

sudo cp -r /home/my_home /media/backup/my_home

その結果、外部ドライブ上のすべてのフォルダーはによって所有されるようになりましたroot:root。どうすればcp元の所有権と許可を保持できますか?


23
はい、グーグルはまだ「男」より速いので、彼が尋ねてくれてうれしいです:-)。
Stijn Geukens

3
彼も尋ねてくれてうれしいです
オレ

5
@StijnGeukensそれはグーグルがより速いということさえありmanません、それは私にとってさえ不可解であるということです。この場合、manでが-r言いsame as --preserve=mode,ownership,timestampsます。元のアクセス許可を保持することを意味することをどのように知っていたのですか?
コロブキャニオン

@KolobCanyonという意味-p

回答:


455
sudo cp -rp /home/my_home /media/backup/my_home

cpマンページから:

 -p     same as --preserve=mode,ownership,timestamps

 --preserve[=ATTR_LIST]
          preserve the specified attributes (default: mode,ownership,timestamps),
          if possible additional attributes: context, links, xattr, all

129
使用する方がはるかに良いcp -a。これには-recursiveフラグも含まれますが、それ以上のことを行います。ファイルに関するすべてを保持します。SELinuxの属性、リンク、xattrなど。「アーカイブモード」です。そこにバックアップを作成するための優れたツールがありますが、あれば、あなたが使用しているcpバックアップ用以外のものは使用しないでくださいcp -a
ワイルドカード

25
それは機能しますが、忍耐はここで良いです。このコマンドは、完了時にのみすべてを正しく設定します。まだディレクトリをコピーしていて、cpをルートとして実行している間、ディレクトリはルートによって所有されます。このディレクトリでの処理が終了したときにのみ、適切な権限に設定されます。
ポール

4
cp -a一部のシステムでは機能しません。たとえば、OS Xでは、(少なくとも一部のバージョンでは)を使用する必要がありましたcp -pR。私の現在のOS Xシステム(10.10.15)では、cp -a光栄に思われます。
dubiousjim

私は、フォルダ構造をコピーするのcp -aを使用する場合は、使用diff <(getfacl -R folder1) <(getfacl -R folder2)私は別のアクセス制御リスト:(取得するように見える土台
philx_xを

なぜ「cp -p」ではなく「cp -rp」を正しいのですか?
ユージンカウロフ

94

を使用することもできますrsync

sudo rsync -a /home/my_home/ /media/backup/my_home/

rsyncマンページから:

 -a, --archive
              This  is  equivalent  to  -rlptgoD.  It  is a quick way of saying you want
              recursion and want to preserve almost everything (with -H being a  notable
              omission).    The   only  exception  to  the  above  equivalence  is  when
              --files-from is specified, in which case -r is not implied.

              Note that -a does not preserve hardlinks, because finding  multiply-linked
              files is expensive.  You must separately specify -H.

間の比較のために、この質問を参照してくださいcprsynchttps://stackoverflow.com/q/6339287/406686

末尾のスラッシュに注意してください(詳細については、マンページを参照してください)。


4
+1 cp -pはいいですが、rsync私はのエイリアスpcpを作成したので、一般的に出力が非常に好きtime rsync --progress -ahです。私の頭の中の「進行中のコピー」の略です。両方とも受け入れます-rので、一般的な端末の使用には適していますが、残念ながら、sudoこの質問/回答に示されているように組み合わせて使用​​することはできません。
イズカタ

15
NB:はrsync -a、拡張属性(-X)およびACL(-A)を保持しません-簡単な説明は述べていarchive mode; equals -rlptgoD (no -H,-A,-X)ます。例えば、SELinuxコンテキストは、なしでは保存されません-X。多くのユースケースではこれで問題ありませんが、システムパーティションのバックアップを作成する場合、-Xを指定しないとかなり壊れる可能性があります。私の知る限り、cp -a実際にはすべてのファイル属性が保持されます。
ペルセウス14

2
これをテストしただけで、sudo cp -a所有権とグループを保持しながら、sudo rsync -aルートに変更します。したがって、@ Perseidsは正しいです。
ジョンハミルトン

3
@JohnHamiltonミントの下では、これは完全に機能します。所有権とグループを後で変更するだけです(いつかはわかりません)。/homeフォルダー全体をコピーしたばかりで、rsync -aX /home /mnt/sdd/まるで魔法のように機能しました。
オリビエポンズ

@JohnHamiltonそれはペルセイデスが言ったことではありません。
user643011

60
cp -a

どこの-a略ですか--archive-基本的には、ディレクトリをそのままコピーします。ファイルはすべての属性を保持し、シンボリックリンクは逆参照されません(-d)。

からman cp

   -a, --archive
          same as -dR --preserve=all

21

私が使っcp -pdRxなる-p、モード、所有者&タイムスタンプを保存し-d、(あなたがコピーしたファイルの内容の代わりにシンボリックリンクを取得)のリンクを維持する-R再帰的にそれを行うと-x、あなたがコピーしている場合は、1つのファイルシステム(だけは本当に便利に滞在/またはアクティブマウントポイントで何か)。

PS:の-R代わりに-rを使用するのは習慣ls -lRです。


2
cp -ax同じもののわずかに短いバージョンです。これはうまくいきました-ありがとう!
EM0

実際にはとの間に違いが-rあり-Rます。manページを確認してください(ここで引用するには長すぎる特定の部分も)。
ヤモリ

2
私はそこにいるとは思いません(ただし、Unixの一部のバージョンはかつて存在し、現在も存在する可能性があります)。参照してくださいman7.org/linux/man-pages/man1/cp.1.htmlそれは単純に言います-R, -r, --recursive copy directories recursively
StarNamer

14

cpファイルの所有権を保持するオプションがあります。のマニュアルページからcp

-p    Cause cp to preserve the following attributes of each source file in the copy: modification
      time, access time, file flags, file mode, user ID, and group ID, as allowed by permissions.
      Access Control Lists (ACLs) and Extended Attributes (EAs), including resource forks, will also
      be preserved.

11

次のようなことができます:

tar cf - my_home | (cd /media/backup; sudo tar xf - )

tarパーミッション、所有権、ディレクトリ構造をそのまま保持しますが、すべてをバイトのストリームに変換します。ディレクトリを変更する「サブシェル」(括弧で囲まれたコマンド)を実行してtarから、変換を元に戻します。バイトのスチームは、正しい所有権と許可を持つディレクトリとファイルになります。


7

答えは簡単です。許可を保持cpする-pオプションがあります(ここに魚がいます)。

しかし、Wojtekが彼のコメントで述べているように、man cp(すばらしいマニュアルを読むことは)良い出発点です(釣り方を学びたいですか?)。


1

preserve = allを使用すると、コピーはファイルの所有者、グループ、タイムスタンプなどのすべての属性を保持します。したがって、次のコマンドを使用してバックアップを安全に実行してください。

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