HOWTO · PowerShell

PowerShell에서 폴더 비교하는 방법

이 튜토리얼은 PowerShell을 사용하여 두 폴더를 비교하는 방법을 보여줍니다.

이 페이지의 내용

이 튜토리얼은 PowerShell을 사용하여 두 폴더를 비교하는 방법을 보여줍니다.

PowerShell 폴더 비교

PowerShell에서 두 폴더를 비교하는 것은 쉽고 단계별 프로세스입니다. 주어진 폴더의 내용을 비교하기 위해 PowerShell의 Compare-Object 메서드를 사용할 수 있습니다.

주어진 두 폴더에 대한 단계별 프로세스를 확인하세요:

폴더 1

폴더 2

폴더 내용 가져오기

첫 번째 단계는 주어진 폴더의 내용을 가져오는 것입니다. 먼저, 다음 명령을 실행하여 폴더의 자녀를 가져옵니다:

$SourceFolder = Get-ChildItem -Path C:\Users\Sheeraz\DemoFolder1
$DestinationFolder = Get-ChildItem -Path C:\Users\Sheeraz\DemoFolder2

위의 명령은 폴더의 내용을 가져옵니다. 내용을 표시하려면 선언된 변수를 호출합니다:

$SourceFolder

소스 폴더 콘텐츠의 출력은 다음과 같습니다:

    Directory: C:\Users\Sheeraz\DemoFolder1


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----          9/9/2022  12:38 PM            399 Delftstack.java
-a----         8/30/2022   2:45 PM             51 delftstack.rtf
-a----         11/1/2022  12:55 PM         127286 demo.bmp
-a----         7/27/2022   4:15 PM            318 Example1.java
$DestinationFolder

대상 폴더 콘텐츠의 출력은 다음과 같습니다:

    Directory: C:\Users\Sheeraz\DemoFolder2


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----         9/20/2022   5:16 PM             68 composer.json
-a----         9/20/2022   5:16 PM           4774 composer.lock
-a----         9/20/2022   4:11 PM        2801573 composer.phar
-a----         8/30/2022   2:45 PM             51 delftstack - Copy.rtf
-a----          9/9/2022  12:38 PM            399 Delftstack.java
-a----         8/30/2022   2:45 PM             51 delftstack.rtf
-a----         11/1/2022  12:55 PM         127286 demo - Copy.bmp
-a----         11/1/2022  12:55 PM         127286 demo.bmp
-a----         7/27/2022   4:15 PM            318 Example1.java

주어진 폴더의 파일 수와 크기 계산

이는 각 폴더에서 특정 확장자를 가진 파일의 수를 세고 각 폴더의 크기를 계산하는 선택적 단계입니다. 다음 명령을 실행하세요.

각 폴더에서 특정 확장자를 가진 파일의 수를 셉니다:

($DestinationFolder | where { $_.Extension -eq '.java' }).count

위의 명령은 대상 폴더에서 .java 확장자를 가진 파일의 수를 셉니다. 우리 폴더에서 얻는 출력은 2입니다.

소스 폴더에서도 마찬가지입니다:

($SourceFolder | where { $_.Extension -eq '.java' }).count

위의 명령은 소스 폴더에서 .java 확장자를 가진 파일 수를 셉니다. 우리 폴더에서 얻는 출력은 2입니다.

이제 주어진 폴더의 크기를 계산하려면 다음 명령을 실행합니다:

($DestinationFolder | Measure-Object -Property length -Sum).Sum
($SourceFolder | Measure-Object -Property length -Sum).Sum

위의 명령은 각 주어진 폴더의 크기를 계산합니다. 우리 폴더의 출력은 다음과 같습니다:

3061806
128054

이름으로 주어진 폴더 비교

먼저 파일 내부의 내용을 비교하지 않고 폴더의 콘텐츠 이름으로 폴더를 비교할 것입니다. 명령을 확인하세요:

Compare-Object -ReferenceObject $SourceFolder.Name -DifferenceObject $DestinationFolder.Name

위의 명령은 폴더 내용을 이름별로 비교하고 두 폴더에서 서로 다른 파일을 표시합니다. 출력을 확인하세요:

InputObject           SideIndicator
-----------           -------------
composer.json         =>
composer.lock         =>
composer.phar         =>
delftstack - Copy.rtf =>
demo - Copy.bmp       =>

이는 이 다섯 개의 파일이 이름으로 소스 폴더와 다름을 보여줍니다.

파일 내용으로 주어진 폴더 비교

마지막 단계에서 우리는 파일의 내용으로 폴더를 비교할 것입니다. 이 작업을 수행하려면 먼저 폴더의 파일을 hash로 변환해야 합니다.

hash 명령은 사용하기 쉽습니다. 예를 들어:

Get-FileHash 'Delftstack.java'

위의 명령은 파일 Delftstack.java의 hash를 가져옵니다. 출력을 확인하세요:

Algorithm       Hash                                                                   Path
---------       ----                                                                   ----
SHA256          FACF7DD67442E2EF84460669E007DA40D17D82E4448D9DBC7E575D25D6012D30       C:\Users\Sheeraz\Delftstack.java

폴더의 각 파일에 대한 hash를 얻으려면 foreach 루프를 실행해야 합니다. 명령을 확인하세요:

$SourceFolder = Get-ChildItem -Path C:\Users\Sheeraz\DemoFolder1 | foreach { Get-FileHash -Path $_.FullName }
$DestinationFolder = Get-ChildItem -Path C:\Users\Sheeraz\DemoFolder2 | foreach { Get-FileHash -Path $_.FullName }

위의 명령은 두 폴더의 각 파일에 대한 hash를 가져옵니다. 이를 표시하려면 다음 명령을 실행해야 합니다:

$DestinationFolder.Hash
$SourceFolder.Hash

대상 폴더에 대한 출력은 다음과 같습니다:

BBBFED20764B6B3FAE56DF485778F5F27918B63008B0EBCAF1342CA8ADC3EADF
23D197F445E3264BF230128A7AFB9BF0E65209249D51C4AD70F51F44DF2D83C5
8FE98A01050C92CC6812B8EAD3BD5B6E0BCDC575CE7A93B242BDE497A31D7732
3D543438B2036F4AFF2CBCD9527FDB00CB249CF6D4D01E3FC2E5DA1C693EC76C
FACF7DD67442E2EF84460669E007DA40D17D82E4448D9DBC7E575D25D6012D30
3D543438B2036F4AFF2CBCD9527FDB00CB249CF6D4D01E3FC2E5DA1C693EC76C
DE35F58F1AF9A75902844BA13D5821EB99957B79555330EFF8C9F974C2481932
DE35F58F1AF9A75902844BA13D5821EB99957B79555330EFF8C9F974C2481932
CCCDDAFD5EDB60F6CDB4E20CFE9FEBE74AB15D28AD0E465B56D23247F33B3315

소스 폴더에 대한 출력은 다음과 같습니다:

FACF7DD67442E2EF84460669E007DA40D17D82E4448D9DBC7E575D25D6012D30
3D543438B2036F4AFF2CBCD9527FDB00CB249CF6D4D01E3FC2E5DA1C693EC76C
DE35F58F1AF9A75902844BA13D5821EB99957B79555330EFF8C9F974C2481932
CCCDDAFD5EDB60F6CDB4E20CFE9FEBE74AB15D28AD0E465B56D23247F33B3315

이제 우리는 두 폴더의 내용을 그들의 hash 값으로 비교할 수 있습니다. 명령을 확인하세요:

Compare-Object -ReferenceObject $SourceFolder.Hash  -DifferenceObject $DestinationFolder.Hash

위의 명령은 두 폴더의 내용을 그들의 hash로 비교하고 서로 다른 내용에 대한 hash를 출력합니다. 출력을 확인하세요:

InputObject                                                      SideIndicator
-----------                                                      -------------
BBBFED20764B6B3FAE56DF485778F5F27918B63008B0EBCAF1342CA8ADC3EADF =>
23D197F445E3264BF230128A7AFB9BF0E65209249D51C4AD70F51F44DF2D83C5 =>
8FE98A01050C92CC6812B8EAD3BD5B6E0BCDC575CE7A93B242BDE497A31D7732 =>
3D543438B2036F4AFF2CBCD9527FDB00CB249CF6D4D01E3FC2E5DA1C693EC76C =>
DE35F58F1AF9A75902844BA13D5821EB99957B79555330EFF8C9F974C2481932 =>

어떤 파일이 내용이 다른지 알 수 없으므로 파일의 이름을 표시하려면 다음 명령을 실행합니다:

(Compare-Object -ReferenceObject $SourceFolder -DifferenceObject $DestinationFolder  -Property hash -PassThru).Path

위의 명령은 두 폴더에 서로 다른 내용을 포함하는 파일의 전체 경로를 보여줍니다. 출력을 확인하세요:

C:\Users\Sheeraz\DemoFolder2\composer.json
C:\Users\Sheeraz\DemoFolder2\composer.lock
C:\Users\Sheeraz\DemoFolder2\composer.phar
C:\Users\Sheeraz\DemoFolder2\delftstack.rtf
C:\Users\Sheeraz\DemoFolder2\demo.bmp