cpコマンドのコピーで保持される属性

Last modified: 2019-04-10

ファイルやディレクトリをコピーした際に保持できる属性の種類

ファイルやディレクトリにはその名前の他にファイルシステム上の幾つかの情報が存在する。これらはファイルやディレクトリの “属性” と呼ばれる。

cpコマンドでのコピーの際には、下の各属性について保持するかしないかをオプション指定によって選択することができる。

  • タイムスタンプ
    • 最終更新日時
    • 最終アクセス日時
  • 所有者情報
    • 所有ユーザ
    • 所有グループ
  • アクセス権 (パーミッション)
  • SELinuxの “コンテキスト” と呼ばれる情報 (SELinuxが有効なシステムの場合のみ)
  • ディレクトリ内に存在するハードリンク (ディレクトリの場合のみ・指定しないと同一内容のファイルが複数作られる)
  • ファイルシステムの拡張属性 (拡張属性を有効にしているファイルシステム内のみ)

コピーを行うユーザの権限によっては保持されないこともあり、例えば所有者と所有グループは一般ユーザ権限で保持しようとしてもそうはならずにcpコマンドを実行したユーザが新規に作成するファイルと同様に扱われる。

-pオプションと-aオプションの挙動

-pオプションの挙動

-pオプションを付けると

  • タイムスタンプ (= 最終更新日時と最終アクセス日時)
  • 所有者情報 (= 所有ユーザと所有グループ)
  • アクセス権 (パーミッション)

が保持される。

-pオプションだけを付けた場合、シンボリックリンクを1番目の引数(コピー対象)としたときにコピー出力はそのリンク先の複製となり、シンボリックリンクはシンボリックリンクとしてはコピーされない。

-aオプションの挙動

-aオプションを付けると、はじめに挙げた情報の全てが保持される。更にディレクトリ(以下全て)を対象としたコピーも可能になり、シンボリックリンクを対象としたコピー時にはコピー出力もシンボリックリンクとなる(シンボリックリンクはシンボリックリンクとしてコピーされる)。

コピー対象と同じ形が得たいときにはこのオプションを指定する習慣をつけておくとよい。

保持される情報を個別に指定する

保持される情報は--preserveというオプションで個別に指定でき、その種類を示す以下の文字列をコンマ区切りで並べた形で指定する。

  • タイムスタンプ (= 最終更新日時と最終アクセス日時): timestamps
  • 所有者情報 (= 所有ユーザと所有グループ): ownership
  • アクセス権 (パーミッション): mode
  • SELinuxの “コンテキスト” と呼ばれる情報: context
  • ディレクトリ内に存在するハードリンク: links
  • ファイルシステムの拡張属性: xattr

例えば、アクセス権とタイムスタンプだけを保持したい場合は--preserve=mode,timestampsとする(=の右側の順番は逆でも可)。

--preserve=allを指定すると、上記の全てを保持しようとする。-aオプションもこの指定を含んでいる。

--no-preserve=[一覧]オプションを指定すると、保持しない情報が指定できる(例:--no-preserve=mode,ownership)。

頻繁に用いたい組み合わせがある場合はシェルのエイリアスを定義すると便利。

関連: -aオプションに含まれる指定を同オプションを用いずに行う

シンボリックリンクをシンボリックリンクとしてコピーするための指定

-aオプションを用いずにシンボリックリンクをシンボリックリンクとしてコピーする場合は-Pオプションを付ける。

指定ディレクトリ以下のコピーを行うための指定

-aオプションを付けずに指定ディレクトリ以下全てをコピーする場合は-Rオプションを付ける。