• ベストアンサー

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

"cp -a"と"cp -r"の違い -aは「できるだけ属性や構造を保持する」 -rは「ディレクトリを再帰的にコピーする」 ですが、「属性や構造を保持する」「再帰的にコピーする」の意味がよくわかりません。 また、コピーしたいディレクトリから下のディレクトリやファイルまで含めてそのままコピーするにはどちらが適しているのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.1

> コピーしたいディレクトリから下のディレクトリやファイルまで含めてそのままコピーする 「下のディレクトリやファイルまで含めて」という条件だけを指定するのが-rオプションです。 -rオプション無しだと、cpはファイルしかコピーできませんが、-rオプションを付けると 「コピーしようとしている物がディレクトリだったら、その中に入っている物をコピーする」 「そうやってコピーしようとしている物がまたディレクトリだったら、さらにその中に入っている物をコピーする」 … と、順次ディレクトリを辿ってコピーしていきます。 この「ディレクトリを順次辿る」ことを「再帰的」と称しています。 一方、-aオプションの「属性」は、ファイルのタイプスタンプなどのことです。 -a 無しだと、ファイル先のファイルの更新時刻はコピーを実行した時刻になりますが、-a を付けると、更新時刻などもコピー元と同じになります。 「構造」とは、ディレクトリやシンボリックリンクなどの、特殊なファイルのことです。そのため、-aオプションでも-rオプションと同じく、再帰的なコピーは行います -rオプションでは、タイムスタンプなどの情報が消えてしまいますし、 シンボリックリンクも「ファイルとしてコピー」されてしまいますので、「そのままコピーする」のなら、 -a オプションの方がいいでしょう。

nomalphard
質問者

お礼

わかりやすい回答でした。 ありがとうございました。

その他の回答 (1)

回答No.2

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 の代わりにはなりません。

nomalphard
質問者

お礼

なるほど。 Linux以外では違うのですね。 ありがとうございました。

関連するQ&A

  • cpコマンドのオプションについて

    現在、Linuxについて学習を進めていますが、cpコマンドの以下のオプションの意味の違いが分かりませんので、ご教授いただけますでしょうか。 -a : コピー元のファイルとディレクトリを再帰的にコピー。 -r : ディレクトリ内を再帰的にコピー。 ちなみに、-rは使うなと書いてあるサイトもありました。

  • cpのコマンドの使い方が解りません

    お世話になります。初心者です。 cakephpでサイト構築しています。 ディレクトリのコピーをしたいのですが、CUIでの操作がすごく苦手です。 まず、古いappと新しいappがあり、その中のtmpだけをコピーしたいです。 色々ネットで検索して, cp -r 移動元ディレクトリ 移動先ディレクトリ で出来ると書いてあったので、 cp -r tmp/ new/app/tmp と打ってみました。 古いappにあるtmpディレクトリに新しいtmpディレクトリをコピーしようと、コマンドを打ったのですが、ディレクトリを作成できずコピーも出来ません : そのようなファイルやディレクトリはありません。というエラーになります。 階層の指定が間違っているのでしょうか?ディレクトリを作成できないという事の意味が解りません。 お詳しい方、ご教授頂けますと幸いです。 よろしくお願いします!

  • 特定の拡張子だけディレクトリを維持したままコピー

    UNIXコマンドでcp -r とすればディレクトリの形を維持したまま再帰的にコピーできますよね。ここで特定のファイル名や拡張子(例えば.mp3)だけコピーしたいという場合、どのようなコマンドを使えばいいですか?

  • フォルダfolderをフォルダa01,a02,...a42にコピーするには?

    bash のコマンドの書き方についてです。 folder という名前のフォルダがあります。これをそのまま a01,a02,...,a42 という42個のフォルダにコピーするには どうしたら簡単にできるでしょう。 a?? の中にfolder というフォルダを作って、その中にfolder の中身を (再帰的に)コピーするのです。 a01 だけにコピーするなら $ cp -R folder a01 とすれば良いのですが。

  • Linux cpコマンドの使い方がわかりません

    ファイルをコピーしたいのですが home/test1/test2 こんなディレクトリになってます。 test1のディレクトリにあるlog1ファイルを test2にコピーしたいのですが、 cp log1 test2 とすると、test1のディレクトリの中にtest2という 名前の、log1をコピーしたファイルができます。 test2というのをディレクトリ名として認識してくれません。 cp log1 test2/ もできません。 "log1/test2"のファイルかディレクトがありません、と返ってきます。 基本的はことですが、教えてください。

  • cpについて教えてください。

    LINUXを最近使いはじめた、ど素人です。 ひとつのファイルを複数のディレクトリにコピーする方法がわかりません。 例として  file1 dire1 dire2 というものがあるとします。  (ファイル:file1    ディレクトリ:dire1,dire2) ワイルドカードを使って  cp file1 dire* のようにやったのですがエラーが返ってきました。 これはディレクトリに対してワイルドカードは使えないからなのでしょうか? ひとつのファイルを複数にコピーする方法をおしえてください。 (できれば、ワイルドカードのようにひとつひとつ入力しない方法が いいです) 長年使ってる方で、そんな方法ないでしょって方はそれだけでも 教えてもらえるとあきらめがついて助かります。 よろしくおねがいします。

  • Linux初心者です。cpコマンドの使い方について質問させてください。

    Linux初心者です。cpコマンドの使い方について質問させてください。 あるディレクトリ(dirA)の中身を、隠しファイルも含めてすべて、 別のディレクトリ(dirB)の配下へとコピーしたいのですが、 ====================================================== > cp dirA/* dirB とすると、隠しファイルがコピーされず、 > cp dirA dirB とすると、dirBの配下に新たにdirAが作られてしまいます。 ====================================================== コピー元のdirAとコピー先のdirBを統合して、なおかつ 隠しファイルもコピーしたいのですが、 > cp dirA/* dirB; cp dirA/.* dirB のようにコマンドを二つに分けるしかないのでしょうか。 一つのコマンドでできる方法がありましたら、 ご教授お願いします。

  • rm,cpコマンドの置き換えについて

    linux初心者のため、困っています。 組み込みで、ディレクトリの削除とコピーを行いたいのですが、置き換えができません。どなたか教えてください。 コマンドでは以下のようになるのですが… (1)rm -r -f /ディレクトリ名/ (2)cp -r -f /元ディレクトリ名/ /先ディレクトリ名/ 無知で申し訳ありませんが、よろしくお願いします。

  • OSによるcpコマンドの動作違いに関して(特にリンクファイルのコピー)

    cpコマンドでシンボリックリンクファイルをコピーする際にlinux版のcpではリンクのままコピーされますが、solaris版ではハードコピーされてしまいます。 リンクをリンクのままとしてコピーするにはtarを使うなど他の方法も考えられますが、出来ればコピーコマンドのオプションによって簡単に出来たら楽と思っています。 どのようにしたらよいのでしょうか? <cpのバージョンを使い分ける、オプションを与える等々> また、linux版でも「あるファイルのリンクのリンク」をコピーすると元ファイルまで辿って新しいリンクファイルが作成される様です。これを直接コマンドラインで指定したファイルのリンクとしたい場合どのようなオプションを与えるのが良いのでしょうか? 細かな内容で申し訳在りませんが、宜しくお願いいたします。 ------ [linux(Redhat8)版cp]  touch file; ln -s file linked_file cp -R linked_file aaa ※ aaa はfileのシンボリックリンクになる /bin/cp --version cp (fileutils) 4.1.9 著者 Torbjorn Granlund, David MacKenzie, and Jim Meyering. Copyright (C) 2002 Free Software Foundation, Inc. [solaris(sunos5.8)版cp] ※ 上と同じコマンド実行でcpは実ファイルになる /mp/suel/tool/bin/cp --version cp (GNU fileutils) 4.0

  • cpコマンドトラブル

    solaris10(sparc版) cpコマンドにて95Gのファイルとディレクトリを新規のボリュームディスクにコピーを実施した所、95Gの倍の140Gでコピーされてしまいこのままだとディスクの圧迫が発生する為、途中でstopをしました。 (本来はtarコマンドでオプションeをつけて圧縮するつもりでしたが置く場所がなかったのでcpコマンドで実施) 補足: ミドルウエアー:ベリタスボリュームマネージャー なぜこのようになったのかご教授を頂ければ幸いです。 又、cpコマンドには容量の限界があるのでしょうか? (かなり泣きそうです。)