いくつかのファイルを含むディレクトリSourceがあり、それをDestinationフォルダーにコピーしたいと思います。宛先が存在する可能性があり、ファイルがすでに存在している可能性があります。ソース内のファイルと同じ名前のファイルは上書きする必要があります。
これをPowershellで実行すると:
Copy-Item Source Destination -Force -Recurse
Copy-Item Source Destination -Force -Recurse
Copy-Item Source Destination -Force -Recurse
次に、最初の行で.\Destination
フォルダーを作成し、.\Source
をそのフォルダーにコピーします。これを次回繰り返します。ただし、2行目は.\Source
を新しい.\Destination
フォルダーにコピーし(.\Destination\Source
を作成)、3行目は.\Destination\Source
を再度上書きします。
最初のケースのように常に動作させるにはどうすればよいですか?つまり、コピーする代わりに.\Destination
を上書きしますか?
だから問題は
cp -r -fo foo bar
bar
が存在せず、かつ
cp -r -fo foo/* bar
bar
が存在する場合にのみ機能します。したがって、回避するには、何かを行う前にbar
が存在することを確認する必要があります
md -f bar
cp -r -fo foo/* bar
Steven Pennyの回答 https://superuser.com/a/742719/126444 は、ターゲットディレクトリの元のコンテンツを削除せず、追加するだけです。ターゲットフォルダーをソースのコンテンツで完全に置き換える必要があり、2つの関数を作成しました。
function CopyToEmptyFolder($source, $target )
{
DeleteIfExistsAndCreateEmptyFolder($target )
Copy-Item $source\* $target -recurse -force
}
function DeleteIfExistsAndCreateEmptyFolder($dir )
{
if ( Test-Path $dir ) {
#http://stackoverflow.com/questions/7909167/how-to-quietly-remove-a-directory-with-content-in-powershell/9012108#9012108
Get-ChildItem -Path $dir -Force -Recurse | Remove-Item -force -recurse
Remove-Item $dir -Force
}
New-Item -ItemType Directory -Force -Path $dir
}
「ソース」フォルダのコンテンツのみをコピーする場合は、
copy-item .\source\* .\destination -force -recurse
次のディレクトリ構造があるとします。
root
ルートフォルダーでは、次の一連のコマンドを使用して、必要な結果を得ることができます。
$files = gci ./folder_b -name
cp ./folder_a/*.txt -Exclude $files ./folder_b
C.txtのみがコピーされます