8

У меня есть каталог Source с некоторыми файлами, которые я хотел бы скопировать в папку Destination. Адресат может существовать, и в нем уже могут быть файлы. Любые файлы с тем же именем, что и в Source, должны быть перезаписаны.

Если я запускаю это в 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 вместо копирования в него?

4 ответа4

6

Так что проблема в том, что

cp -r -fo foo bar

работает только если bar не существует и

cp -r -fo foo/* bar

работает только если bar существует. Таким образом, чтобы обойти, вы должны убедиться, что bar существует, прежде чем делать что-либо

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

Ответ Стивена Пенни 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

Если вы хотите скопировать только содержимое папки "source", используйте

copy-item .\source\* .\destination -force -recurse
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 будет скопирован

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .