回答:
これは、の-T
オプションを使用して行うことができますcp
。
のマニュアルページを参照してくださいcp
。
-T, --no-target-directory
treat DEST as a normal file
したがって、例に従って、以下はファイル構造です。
$ tree test
test
|-- bar
| |-- a
| `-- b
`-- foo
|-- a
`-- b
2 directories, 4 files
-v
Verboseに使用すると、明確な違いがわかります。オプション
だけを使用する-R
場合。
$ cp -Rv foo/ bar/
`foo/' -> `bar/foo'
`foo/b' -> `bar/foo/b'
`foo/a' -> `bar/foo/a'
$ tree
|-- bar
| |-- a
| |-- b
| `-- foo
| |-- a
| `-- b
`-- foo
|-- a
`-- b
3 directories, 6 files
このオプションを使用する-T
と、内容が上書きされ、宛先はディレクトリではなく通常のファイルのように扱われます。
$ cp -TRv foo/ bar/
`foo/b' -> `bar/b'
`foo/a' -> `bar/a'
$ tree
|-- bar
| |-- a
| `-- b
`-- foo
|-- a
`-- b
2 directories, 4 files
これで問題が解決するはずです。
bar/
)にあるがソース()にないファイルはfoo/
残りますそのため、これはほとんどの人がディレクトリの完全な上書きを検討するものではありません。すなわち。場合はbar/baz
、すでに存在していた、それはまだ...その後に存在するであろう
rm -rf bar/* && cp -TRv foo/ bar/
2つのステップで実行します。
rm -r bar/
cp -r foo/ bar/
bar
であり、コンテンツがと同じであることを保証します。のアイテムとに既に存在している可能性のある他のアイテムのfoo
組み合わせではありません。以下の@Saurabh Meshramからの非常に賛成の回答にはこの問題があります。foo
bar
rm -rf bar/; cp -r foo/ !$
foo
を想像してくださいbar
...中には、削除したくないというファイルが含まれbar
ていない可能性がありますfoo
。これは現実的な答えとは見なされませんimho
bar/
最終的にと同じになるようにしたい場合はfoo/
、rsync
代わりに使用してください:
rsync -a --delete foo/ bar/
ほんの少しだけ変更した場合、ディレクトリ全体を削除して再コピーするよりもはるかに速く実行されます。
-a
忠実にファイルをコピーする「アーカイブモード」、であるfoo/
のは、bar/
--delete
foo/
からではない余分なファイルも削除しbar/
、最終的にbar/
同一になるようにします-vh
、冗長で人間が読める形式を追加してくださいfoo
は必須です。それ以外の場合rsync
は、それ自体を上書きfoo/
するのbar/foo/
ではなくコピーしますbar/
。
foo/
内容にbar/
、我々 、両方のスラッシュを使用し、それは動作しませんので、上のスラッシュで予想通りそれは混乱しています。どちらもかかわらず、;それがソース上のスラッシュの有無を尊重するにもかかわらず、スラッシュを持っているかのようにこそこそ常にrsyncが先パスを解釈しますパスです。ディレクトリではなくの内容をfoo/
にコピーする場合は、ソースパスにスラッシュが必要です。bar/
foo/
それ自体がbar/
として着陸しますbar/foo
。)rsync
他に何ができるか(sshを介したコピーなど)に興味がある場合は、非常に強力で便利です。
cp -T
、それはまた、MacOSXの👍上で動作しますので、オプション
次のcp
コマンドを使用します。
cp -Rf foo/* bar/
cp
コマンドがソースからファイルを削除する必要があるのはなぜですか?
次のコマンドは、ドットファイル(隠しファイル)がコピーに含まれるようにします。
$ cp -Rf foo/. bar
.
ディレクトリ内のすべてのファイルを意味します。したがって、当然、隠しファイルも含まれます。
@Jonathan Wheelerに非常に似ています。
覚えたくないが書き直したくない場合bar
:
rm -r bar/
cp -r foo/ !$
!$
前のコマンドの最後の引数を表示します。