「cp」コマンドを使用してディレクトリの内容をコピーします


33

あるディレクトリのすべての内容を別のディレクトリにどのようにコピーしますか?

例えば:

$ cd /home/newuser
$ cp -a /backup/olduser/* .

上記の問題は、グロビングパターン「*」が隠しディレクトリ「。」と一致することです。そして、「..」と「newuser」内のディレクトリ「olduser」、およびその内容になります。

次のようなこともできます。

$ rmdir /home/newuser
$ cp -a /backup/olduser /home/newuser

しかし、newuserにすでにデフォルトのファイルとディレクトリが含まれている場合はどうでしょうか?

基本的な「cp」コマンドとシェルだけを使用して、あるディレクトリの内容を別のディレクトリに移動する最も簡単で、最も正確で覚えやすい、混乱しない方法は何ですか?

回答:


31

試してください:

cp -ra /backup/olduser/. /home/newuser

これは素晴らしいことですが、どのように機能するのか正確にはわかりません。私はどのように理解していないので、それはおそらくだと思う...仕事を。説明する気?
bradley.ayers

これはうまくいきましたが、cp -r ./a bうまくいきませんでした。理由は何ですか?
ブリーク

3
私にとっても機能しますが、rオプションは必要ありません。aオプションは意味しますr
MountainX

1
-rパラメーターは、この時点では少し冗長なようです!
お祝いのマスター

-aこの状況では、パラメーターは何の助けにもなりません。このコマンドcp -r ./a/. bは、directoryの内容(および内容のみ)をdirectory aにコピーしますb-a質問に関連していないフラグジャムリンク、タイムスタンプなど、。
スティーンシュット

23

2つのディレクトリaおよびb。

両方にファイルがあります。

aとbを含むディレクトリにいます。

cp -r ./a b

-r =再帰的に。


-aですべてのファイルを取得したくないですか?
体重

7
-a引数は、すべてのファイルには関係ありません。アーカイブの略です。ファイルの所有権、アクセス許可、アクセス時間などを保持します。-a引数(非常に便利ですが)は標準オプションではなく、いくつかのcpそれを提供しません。
受信3:09で

1
@mch:自動的にあなたが言ったので、含まれるcpディレクトリをコピーするためにa、およびa/.somedotfileに含まれていますa。場合bに存在する、このコマンドはの正確なコピーが作成されますaではb/a
いんちきのキホーテ2009年

2
簡単な方法:cp -R /some/dir/* /another/dir
n0pe

1
これは、a / fooをb / fooではなくb / a / fooに
コピーします-Sparr

19

デフォルトでは、2番目のディレクトリが存在する場合、cp最初のディレクトリ 2番目のディレクトリにコピーすることに注意してください。

たとえば、ディレクトリをにcp -r a bコピーします。存在しない場合は、のコンテンツで作成されます。 abba

コピーしたい場合は、コンテンツa中をb使用(例えばマウントポイントにファイルシステム全体をコピーする場合):

cp -r a/. b

前の回答のように。

また-a、他の回答のいくつかで使用されているが、-dr --preserve=allタイムスタンプ、コンテキスト、および拡張属性と同じであり、保持されることに注意してください。


どのように動作し/.ますか?
bradley.ayers

a/.ディレクトリ自体ではなくディレクトリ 'a'のコンテンツを表します。ほとんどの場合、同義語ですが、を使用する場合cp -r、cpのデフォルト動作(INTO bのコピー)を回避します。
ニコラスボンネフォン

素晴らしいヒント、これはまさに私が探していたものですが、他の場所で見つけることができませんでした-すべての「foo / *」または「-r foo /」はコーナーケースで失敗します。
テナー

@TimoHuovinen '。' ワイルドカードではありません。文字通り「親」ディレクトリであり、「..」は祖父母です。これは、「/ foo /./././././。」を意味します 「/ foo」と同じディレクトリで、「/ foo / bar / ..」は「/ foo」と同じディレクトリです。ファイルシステムに組み込まれているハードリンクと考えてください。
クックスマン14年

@quuxmanありがとう、当時は気づかなかった。人々を混乱させないために、古いコメントを削除します。
ティモHuovinen 14年

6

シェルを真剣に再構成しない限り、グロビングパターン「*」は「。」と一致しません。または「..」。エコー*のみを使用して確認できます。代わりに行うのは、名前が「。」で始まるファイルを省略することです。そのため、アプローチはすべての隠しファイルを見逃します。この動作の一部は、シェルオプション(bashのdotglobオプションなど)で調整できますが、探しているポータブルで堅牢なオプションにはなりません。

これを1回または2回以上行う必要がある場合は、慎重に作成されたソースとターゲットの仕様で(特定のニーズに応じて)rsyncまたはunisonを検討することをお勧めします。

もう1つの方法は、ソースディレクトリをtarballに入れ、既存のターゲットディレクトリ上で展開します。


1
:私はこれを使用( cd /src/dir ; tar cf - . ) | ( cd /dest/dir ; tar xf - )... tar cf - .、タールのソースディレクトリをドットファイルが含まれており、のSTDINにパイプますSTDOUT、それを吐きますtar xf -
いんちきのキホーテ2009年

OPのポイントは、「。」で始まるファイルを参照する方法にあると思います。しかしではない特別な「」および「..」ディレクトリ。rsyncやその他の複雑なプログラムを使用する代わりに、上記のはるかに洗練されたソリューションがあります。
クックスマン14年

2

これにより、通常のファイルと隠しファイルの両方がコピーされますが、親ディレクトリ(..)は除外されます。

cd /directory/to/copy
cp -r * .[^.]* /destination/directory

親ディレクトリを除外しない..と、宛先ディレクトリのすべてのコンテンツも同様に終了します。


1
しかし、これはまだ(たとえば、または)で始まる 名前を除外します。.......super-hidden
スコット14

0

ドットで始まるファイルをコピーするには、cp。* target /を実行します。

cpコマンドを2回実行するのが最も簡単です。

Peter Eisentrautが言うように、通常のグロビングルールには..および。(hm、この文を終了する方法?)

-rを使用して再帰的に実行し、-iを使用してcpに本当にファイルを上書きするかどうかを尋ねます。

cp -ri /backup/olduser/* /newuser/
cp -ri /backup/olduser/.* /newuser/

通常は*一致していない...、しかし、あなたが使用している場合それはありません.*。試してくださいecho .*。を除外する...は、次のパターンを使用します.[^.]*
mch 2009年

@mch:ただし(たとえば、または).[^.]*始まる 名前は除外されます。.......super-hidden
スコット14

0

これは、隠しディレクトリを除くすべてのファイルとディレクトリを現在のディレクトリからどこにでも再帰的にコピーするために機能します:

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