Windows에서 파일 이름이 아닌 콘텐츠에 따라 결정된 대로 한 폴더에만 존재하고 다른 폴더에는 존재하지 않는 파일 목록을 가져옵니다.

Windows에서 파일 이름이 아닌 콘텐츠에 따라 결정된 대로 한 폴더에만 존재하고 다른 폴더에는 존재하지 않는 파일 목록을 가져옵니다.

2개의 디렉토리(DirA 및 DirB)가 있는 경우 DirA에는 있지만 DirB에는 없는 파일 목록을 찾는 가장 효율적인 방법은 무엇입니까?

도구를 사용하여 이 작업을 시도했지만 jdupes.exe --printunique --recurse -ODirA에 해당 파일의 중복이 있는 경우 위 기준을 충족하는 파일을 제외하는 부작용이 있습니다.

파일은 DirA와 DirB의 완전히 다른 하위 디렉터리에 있을 수 있으며 이름도 다를 수 있습니다. 따라서 파일의 내용이 유일한 내구성 특성입니다.

답변1

에서 반환된 문자열파워셸'에스Get-FileHash의 열쇠로 사용할 수 있습니다해시테이블콘텐츠를 정규화된 경로와 연결합니다. 이 코드는 다음 주의 사항을 포함하여 각 경로에 대한 해시 테이블을 생성합니다.

  • 모든 빈 파일의 콘텐츠 해시가 동일하므로 빈 파일은 무시됩니다. (각 디렉토리에 빈 파일 목록을 만들 수도 있습니다)
  • 중복이 발견된 경우이내에우리가 인덱싱하고 있는 디렉터리에서 발견된 첫 번째 파일만 $HashOut테이블에 추가됩니다. 테이블 $Dups에는 동일한 콘텐츠를 공유하는 모든 경로 목록이 포함됩니다.

파워셸:

Function Get-DirHash ( [String]$PathIn , [PSObject]$HashOut )
{
    $HashOut.Clear()
    gci $PathIn *.txt -Recurse | ? Length -gt 0 | Get-FileHash | %{
        If ( $HashOut.Contains($_.Hash) )
        {
            If ( $Dups.Contains($_.Hash) )
            {
                $Dups[$_.Hash] += $_.Path
            }
            Else
            {
                $Dups.Add( $_.Hash , @( $HashOut[$_.Hash] , $_.Path ))
            }
        }
        Else
        {
            $HashOut.Add( $_.Hash , $_.Path )
        }
    }
}

$DirA     = 'c:\whatever'
$DirB     = 'c:\whenever'
$TableA   = @{}
$TableB   = @{}
$Dups     = @{}
$Unique2A = New-Object System.Collections.Generic.List[String]

Get-DirHash -PathIn $DirA -HashOut $TableA
Get-DirHash -PathIn $DirB -HashOut $TableB

$TableA.Keys | %{
    If ( ! ( $TableB.Contains($_) ))
    {
        $Unique2A.Add( $TableA[$_] )
    }
}

$Unique2A | Out-GridView



완전히 테스트되지는 않았지만 이것이 크기가 일치하는 파일에 대한 해시만 계산하는 트릭을 수행할 것이라고 믿습니다.

$DirA     = 'c:\whatever'
$DirB     = 'c:\whenever'

$TestA = [Regex]::Escape($DirA)

$MasterList = gci $DirA , $DirB -Filter *.txt -recurse | Group Length

$Unique2A_BySize = ( $MasterList | ? Count -eq 1 |
     ? { $_.Group[0].DirectoryName -match $TestA } ).Group.FullName

$Unique2A_ByHash = ( $MasterLIst | ? Count -gt 1 | %{
    $_.Group | Get-FileHash | Group Hash |
        ? Count -eq 1 |
           ? { $_.Group[0].Path -match $TestA }
} ).Group.Path

( $Unique2A = $Unique2A_BySize + $Unique2A_ByHash ) | Out-GridView

읽기 어려운 내용으로 인해 개선될 수 있습니다.

$DirA     = 'c:\whatever'
$DirB     = 'c:\whenever'

$TestA = [Regex]::Escape($DirA)

$Unique2A = ( ( $MasterList = gci $DirA , $DirB -Filter *.txt -recurse | Group Length ) |
    ? Count -eq 1 |
        ? { $_.Group[0].DirectoryName -match $TestA } ).Group.FullName +
( $MasterLIst | ? Count -gt 1 | %{
    $_.Group | Get-FileHash | Group Hash |
        ? Count -eq 1 |
           ? { $_.Group[0].Path -match $TestA }
} ).Group.Path

$Unique2A | Out-GridView

답변2

디렉토리 목록을 Excel에 복사하고 UNIQUE 함수를 사용합니다.

관련 정보