web-dev-qa-db-ja.com

ディレクトリをコピーして、Powershellを使用して存在する場合、その内容を上書きするにはどうすればよいですか?

いくつかのファイルを含むディレクトリ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を上書きしますか?

9
Douglas

だから問題は

cp -r -fo foo bar

barが存在せず、かつ

cp -r -fo foo/* bar

barが存在する場合にのみ機能します。したがって、回避するには、何かを行う前にbarが存在することを確認する必要があります

md -f bar
cp -r -fo foo/* bar
6
Steven Penny

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
}
3

「ソース」フォルダのコンテンツのみをコピーする場合は、

copy-item .\source\* .\destination -force -recurse
3
BroScience

次のディレクトリ構造があるとします。

  • root

    • folder_a
      • a.txt
      • b.txt
      • c.txt
    • folder_b
      • a.txt
      • b.txt

    ルートフォルダーでは、次の一連のコマンドを使用して、必要な結果を得ることができます。

    $files = gci ./folder_b -name
    cp ./folder_a/*.txt -Exclude $files ./folder_b

C.txtのみがコピーされます

1
kb_sou