アプリ版:「スタンプのみでお礼する」機能のリリースについて

"cp -a"と"cp -r"の違い

-aは「できるだけ属性や構造を保持する」
-rは「ディレクトリを再帰的にコピーする」
ですが、「属性や構造を保持する」「再帰的にコピーする」の意味がよくわかりません。

また、コピーしたいディレクトリから下のディレクトリやファイルまで含めてそのままコピーするにはどちらが適しているのでしょうか?

A 回答 (2件)

> コピーしたいディレクトリから下のディレクトリやファイルまで含めてそのままコピーする



「下のディレクトリやファイルまで含めて」という条件だけを指定するのが-rオプションです。
-rオプション無しだと、cpはファイルしかコピーできませんが、-rオプションを付けると
「コピーしようとしている物がディレクトリだったら、その中に入っている物をコピーする」
「そうやってコピーしようとしている物がまたディレクトリだったら、さらにその中に入っている物をコピーする」

と、順次ディレクトリを辿ってコピーしていきます。
この「ディレクトリを順次辿る」ことを「再帰的」と称しています。

一方、-aオプションの「属性」は、ファイルのタイプスタンプなどのことです。
-a 無しだと、ファイル先のファイルの更新時刻はコピーを実行した時刻になりますが、-a を付けると、更新時刻などもコピー元と同じになります。
「構造」とは、ディレクトリやシンボリックリンクなどの、特殊なファイルのことです。そのため、-aオプションでも-rオプションと同じく、再帰的なコピーは行います

-rオプションでは、タイムスタンプなどの情報が消えてしまいますし、
シンボリックリンクも「ファイルとしてコピー」されてしまいますので、「そのままコピーする」のなら、 -a オプションの方がいいでしょう。
    • good
    • 5
この回答へのお礼

わかりやすい回答でした。

ありがとうございました。

お礼日時:2010/01/18 16:17

Linuxということで、GNU cp を仮定して議論します。

他のUNIX系OSの
cpコマンドには -a が無かったり、-r の動作が若干異なるので、
GNU/Linux 以外の環境では注意が必要です。

> また、コピーしたいディレクトリから下のディレクトリやファイル
> まで含めてそのままコピーするにはどちらが適しているのでしょうか?

「再帰的にコピー」とは、「コピーしたいディレクトリから下の
ディレクトリやファイルまで含めてそのままコピーする」という
意味とほぼ同じです。そして、-a と -r のどちらも、
この「再帰的なコピー」を行います。

 しかし、-r でコピーしてしまうと、コピー先のファイルの更新時刻や
所有者といった情報(これらをファイルの属性といいます)が、コピーを
行った時刻やコピーを行ったユーザに変わってしまいますし、デバイス
ファイルやハードリンクといった特殊なファイルが正しくコピーできな
いことがあります。
 -a はそういった問題はありません。-a の「できるだけ属性や
構造を保持する」とはそういう意味です。

ということで、Linux系OS (GNU/Linux) の限りにおいては、
-a と -r だけを比較するなら、-a が適すると考えられます。

ただし、冒頭で書いたように、-a は他のUNIXの cp には
無いことがあるので注意が必要です。Linuxを含めたほとんどの
UNIX系OSで使用できるオプションだけを使って -a に近い動作
させるには、-Rp というオプションになると思います(POSIX)。
それでも、-Rp では、ハードリンクをハードリンクとして
コピーできない等、完全には -a の代わりにはなりません。
    • good
    • 1
この回答へのお礼

なるほど。
Linux以外では違うのですね。

ありがとうございました。

お礼日時:2010/01/19 13:49

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!