web-dev-qa-db-ja.com

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

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

例えば:

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

上記の問題は、展開パターン「*」が隠しディレクトリ「。」と一致することです。そして「..」とすると、「newuser」内に「olduser」というディレクトリが作成され、コンテンツも作成されます。

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

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

しかし、もしnewuserがすでにいくつかのデフォルトのファイルとディレクトリを含んでいるとしたらどうでしょう?

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

35
nomount

試してください:

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

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

どちらにもファイルがあります。

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

cp -r ./a b

-r =再帰的に。

23
Rich Bradshaw

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

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

content of abにコピーする場合(たとえば、ファイルシステム全体をマウントポイントにコピーする場合)は、次のコマンドを使用します。

cp -r a/. b

前の回答のように。

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

19

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

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

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

6

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

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

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

2
mch

これは、隠しディレクトリを除くすべてのファイルとディレクトリを、現在のディレクトリから次の場所に再帰的にコピーする場合に機能します。

cp -rf * ^.* 
0
Seeeve

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

したがって、最も簡単なのは、cpコマンドを2回実行することです。

Peter Eisentraut saisが言うように、通常のグロビングルールには..および。が含まれていません。 (えっと、この文の終わり方は?;)

再帰的にするには-rを使用し、ファイルを本当に上書きするかどうかをcpに確認させるには-iを使用します。

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