あるディレクトリのすべてのコンテンツを別のディレクトリにどのようにコピーしますか?
例えば:
$ cd /home/newuser
$ cp -a /backup/olduser/* .
上記の問題は、展開パターン「*」が隠しディレクトリ「。」と一致することです。そして「..」とすると、「newuser」内に「olduser」というディレクトリが作成され、コンテンツも作成されます。
次のようなこともできます:
$ rmdir /home/newuser
$ cp -a /backup/olduser /home/newuser
しかし、もしnewuserがすでにいくつかのデフォルトのファイルとディレクトリを含んでいるとしたらどうでしょう?
基本的な 'cp'コマンドとシェルだけを使用して、ディレクトリの内容を別のディレクトリに移動するための混乱のない方法で、最も簡単で、最も正確で、覚えやすい方法は何ですか?
試してください:
cp -ra /backup/olduser/. /home/newuser
2つのディレクトリaおよびb。
どちらにもファイルがあります。
Aとbを含むディレクトリにいます。
cp -r ./a b
-r
=再帰的に。
デフォルトでは、cp
は最初のディレクトリをコピーすることに注意してくださいinto 2番目のディレクトリが存在する場合は2番目のディレクトリ。
たとえば、cp -r a b
はディレクトリa
をb
にコピーします。 b
が存在しない場合は、a
の内容で作成されます。
content of a
をb
にコピーする場合(たとえば、ファイルシステム全体をマウントポイントにコピーする場合)は、次のコマンドを使用します。
cp -r a/. b
前の回答のように。
他の回答の一部で使用されている-a
は-dr --preserve=all
と同じであり、タイムスタンプ、コンテキスト、および拡張属性を保持することにも注意してください。
シェルを真剣に再構成していない限り、グロビングパターン「*」は「。」と一致しません。または「..」。エコー*だけを使用して確認できるため。代わりに、名前が「。」で始まるファイルを省略しているので、アプローチはすべての隠しファイルを見逃します。この動作の一部は、シェルオプション(bashのdotglobオプションなど)で微調整できますが、探しているポータブルで堅牢なオプションにはなりません。
これを1回または2回以上行う必要がある場合は、慎重に作成されたソースとターゲットの仕様を使用して、(特定のニーズに応じて)rsyncまたはunisonを調べることをお勧めします。
もう1つの方法は、ソースディレクトリをtarballに入れ、既存のターゲットディレクトリに展開します。
これにより、通常のファイルと隠しファイルの両方がコピーされますが、親ディレクトリ(..
)は除外されます。
cd /directory/to/copy
cp -r * .[^.]* /destination/directory
親ディレクトリを除外しないと、宛先ディレクトリにも..
のすべてのコンテンツが含まれます。
これは、隠しディレクトリを除くすべてのファイルとディレクトリを、現在のディレクトリから次の場所に再帰的にコピーする場合に機能します。
cp -rf * ^.*
ドットで始まるファイルをコピーするには、cp。* target /
したがって、最も簡単なのは、cpコマンドを2回実行することです。
Peter Eisentraut saisが言うように、通常のグロビングルールには..および。が含まれていません。 (えっと、この文の終わり方は?;)
再帰的にするには-rを使用し、ファイルを本当に上書きするかどうかをcpに確認させるには-iを使用します。
cp -ri /backup/olduser/* /newuser/
cp -ri /backup/olduser/.* /newuser/