Powershell을 사용하여 존재하는 경우 디렉토리를 복사하여 해당 내용을 덮어 쓰려면 어떻게해야합니까?


9

일부 파일이 들어있는 디렉토리 소스가 있는데, 대상 폴더에 복사하고 싶습니다. 대상이 존재할 수 있으며 이미 파일이있을 수 있습니다. 소스 파일과 이름이 같은 파일은 덮어 써야합니다.

Powershell에서 이것을 실행하면 :

Copy-Item Source Destination -Force -Recurse
Copy-Item Source Destination -Force -Recurse
Copy-Item Source Destination -Force -Recurse

그런 다음 첫 번째 줄은 폴더를 만들어 폴더 .\Destination에 복사 .\Source합니다. 다음 번에 반복하고 싶습니다. 그러나 두 번째 줄 .\Source은 대신 새 .\Destination폴더에 복사 하고 (을 생성 .\Destination\Source) 세 번째 줄은 .\Destination\Source다시 덮어 씁니다 .

항상 첫 번째 경우처럼 작동하게하려면 어떻게해야합니까? 즉, .\Destination복사하는 대신 덮어 쓰시겠습니까?


당신은 명확히 할 수 있습니까? "source"의 내용을 "destination"에 복사 하시겠습니까? "source"폴더를 "destination"으로 복사하지 않습니까?
BroScience

네 맞습니다. "대상"폴더가 존재하지 않을 수 있으므로 종료되지 않은 경우 폴더를 만들고 싶습니다.
Douglas

대체품으로 robocopy 를 고려해 볼 가치가 있습니다 . 필요한 경우 여전히 powershell에서 호출 할 수 있습니다. if exists문제를 쉽게 처리하고 목적지를 강제로 재귀 적으로 삭제하지 않아도되므로 위험이 따릅니다.
제레미

밀접한 관련 SO 질문 : stackoverflow.com/q/47964451/45375
mklement0

답변:


7

문제는

cp -r -fo foo bar

bar존재하지 않는 경우에만 작동 하고

cp -r -fo foo/* bar

bar존재하는 경우에만 작동 합니다. 따라서 문제를 해결하려면 bar먼저 작업을 수행하기 전에 존재 해야 합니다.

md -f bar
cp -r -fo foo/* bar

3

"source"폴더의 내용 만 복사하려면

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

1
destination이미 존재하는 경우에만 작동 합니다.
Steven Penny

3

Steven Penny의 답변 https://superuser.com/a/742719/126444 는 대상 디렉토리의 원본 내용을 삭제하지 않고 추가합니다. 대상 폴더를 소스의 내용으로 완전히 바꾸고 두 가지 기능을 만들어야했습니다.

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
}

1

다음과 같은 디렉토리 구조를 가지고 있다고 가정 해 봅시다.

  • 뿌리

    • 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 만 복사됩니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.