소스 디렉터리보다 최신 파일이 있는지 대상 디렉터리를 확인하는 가장 좋은 방법

소스 디렉터리보다 최신 파일이 있는지 대상 디렉터리를 확인하는 가장 좋은 방법

소스 디렉터리와 대상 디렉터리가 있습니다. 소스 디렉터리의 모든 항목이 대상 디렉터리의 항목과 같거나 최신인지 확인하고 싶습니다.

Windows에서 가장 좋은 방법은 무엇입니까? Powershell이 ​​바람직하지만 더 빠르면 robocopy와 같은 것에 반대하지 않습니다.

내 초기 생각은 다음과 같습니다.

$src = Get-ChildItem -Recurse -path C:\temp\src\
$dest = Get-ChildItem -Recurse -path C:\temp\dest\
Compare-Object -ReferenceObject $dest -DifferenceObject $src
## TODO: Check result of Compare-Object and throw error if there's an unexpected change?

모든 SideIndicator가 올바른 방향을 가리키는 한 필요한 정보를 얻을 수 있으므로 이를 사용하여 대상의 예상치 못한 변경 사항을 감지할 수 있지만 이 접근 방식은 명확하지 않고 복잡해 보이기 때문에 더 나은 방법이 있는지 궁금합니다. 이 길로 내려가세요.

(사용 사례는 누구도 데브옵스 파이프라인을 통하지 않고 대상을 수정해서는 안 된다는 것입니다. 그러나 때로는 사람들이 그렇게 하기 때문에 대상에 예기치 않게 수정되거나 새 파일이 있는 경우 미리 확인하고 추가 조사를 위해 파이프라인을 종료하고 싶습니다. 파일을 배포하려고 함)

답변1

속성을 테스트하기 위해 만든 파일 구조는 다음과 같습니다.

PS C:\> Get-ChildItem C:\temp2\src -recurse

    Directory: C:\temp2\src

Mode                 LastWriteTime         Length Name                                                                                                                           
----                 -------------         ------ ----                                                                                                                           
-a----         8/27/2022   9:58 PM              3 myfile1.txt                                                                                                                    
-a----         8/27/2022   9:59 PM              6 myfile2.txt

PS C:\> Get-ChildItem C:\temp2\dest -recurse

    Directory: C:\temp2\dest

Mode                 LastWriteTime         Length Name                                                                                                                           
----                 -------------         ------ ----                                                                                                                           
-a----         8/27/2022   9:58 PM              3 myfile1.txt                                                                                                                    
-a----         8/27/2022   9:58 PM              3 myfile2.txt

SRC와 DEST라는 두 개의 디렉터리가 있으며 각각 2개의 파일이 있습니다. 파일 중 하나(myfile2.txt)의 LastWriteTime 값이 다릅니다. 아래 코드를 실행하면 해당 파일과 관련하여 SRC와 DEST 불일치가 있음을 알려주고 동일한 파일에 대해서는 피드백을 제공하지 않습니다.

$srcFiles다음 코드 조각에서는 및 값만 변경하여 $destFiles경로를 편집합니다. 다른 것은 변경할 필요가 없습니다.

$Results = @()
$srcFiles = Get-ChildItem "C:\temp2\src" -recurse | select Name,LastWriteTime
$destFiles = Get-ChildItem "C:\temp2\dest" -recurse | select Name,LastWriteTime
$srcFileTable = @{}
$destFileTable = @{}

foreach($srcFile in $srcFiles)
{
    $srcFileTable.Add(($srcFile.Name),($srcFile.LastWriteTime))
}
foreach($destFile in $destFiles)
{
    $destFileTable.Add(($destFile.Name),($destFile.LastWriteTime))
}

$srcFileTable.keys | %{
    if ($destFileTable.keys -match $_){
        if (!($destFileTable.$_ -match $srcFileTable.$_)) {
            $Results += new-object psobject -property @{Hash="SRC";Key=$_;Value=$srcFileTable.$_}
        }
    } Else {$Results += new-object psobject -property @{Hash="SRC";Key=$_;Value=$srcFileTable.$_}}
}
$destFileTable.keys | %{
    if ($srcFileTable.keys -match $_){
        if (!($srcFileTable.$_ -match $destFileTable.$_)) {
            $Results += new-object psobject -property @{Hash="DEST";Key=$_;Value=$destFileTable.$_}
        }
    } Else {$Results += new-object psobject -property @{Hash="DEST";Key=$_;Value=$destFileTable.$_}}
}
$Results | select Hash,Key,Value | sort -property Key,Hash | FT

이것을 실행하면 다음과 같은 결과를 얻게 됩니다.

Hash Key         Value               
---- ---         -----               
DEST myfile2.txt 8/27/2022 9:58:37 PM
SRC  myfile2.txt 8/27/2022 9:59:09 PM

이는 SRC와 DEST 파일 이름이 서로 다르다는 것을 보여주며 LastWriteTime이 경우 누군가가 myfile2.txt에 대한 SRC 파일을 편집했고 이는 dest의 파일 이름과 다르다는 것을 추론할 수 있습니다.

관련 정보