PowerShell Move-Item Cmdlet을 사용해 파일 이동
Aug 25, 2025
The Move-Item cmdlet을 사용하면 PowerShell에서 파일, 폴더, 레지스트리 키 및 하위 키를 정밀하게 이동할 수 있습니다. 단일 또는 여러 파일을 이동하고, 이동 중에 이름을 바꾸며, 폴더 구조를 유지하거나 평탄화하고, 로컬 또는 네트워크 경로 전반에서 작업할 수 있습니다. 유용한 매개 변수로는 -Recurse, -Include, -Exclude, -Filter, -Force, and -WhatIf가 있습니다. 안전을 위해 이동 작업을 Test-Path, 오류 처리(try/catch), 그리고 로깅과 함께 사용하세요.
일상적인 작업으로 사용자는 파일과 폴더 같은 항목을 컴퓨터의 한 위치에서 다른 위치로 이동하여 데이터를 정리하고 이해하기 쉽게 만듭니다. 이러한 작업은 파일 탐색기에서 제공하는 간단한 copy and paste 옵션으로도 수행할 수 있지만, 숙련된 사용자는 효율성과 정밀성을 위해 PowerShell을 선호할 수 있습니다.
정의: Move-Item Cmdlet
PowerShell의 Move-Item cmdlet은 파일 탐색기에서 항목을 한 위치에서 다른 위치로 이동하며, 속성, 내용, 하위 항목을 그대로 유지합니다. 다음과 같이 사용할 수 있습니다:
- 파일 또는 폴더를 한 디렉터리에서 다른 디렉터리로 이동
- 여러 파일 또는 디렉터리를 한 번에 이동
- 레지스트리 하위 키를 한 키에서 다른 키로 이동
새 위치에 추가되면, 이동된 항목은 원래 위치에서 제거됩니다.
eBook 읽기:
전제 조건으로, 새 위치는 동일한 공급자(provider)가 지원해야 합니다.
Move-Item의 기본 구문
Move-Item cmdlet의 기본 구문은 다음과 같습니다.
Move-Item -Path "sourceFilePath" -Destination "destinationFilePath"
지원되는 매개변수를 사용한 구문 예시는 다음과 같습니다.
Move-Item
[-Path] <String[]>
[[-Destination] <String>]
[-Force]
[-Filter <String>]
[-Include <String[]>]
[-Exclude <String[]>]
[-PassThru]
[-Credential <PSCredential>]
[-WhatIf]
[-Confirm]
[<CommonParameters>]
Move-Item으로 단일 파일 이동하기
PowerShell을 통해 한 위치에서 다른 위치로 단일 파일을 이동하려면 Move-Item cmdlet에서 원본 파일 경로와 대상 디렉터리를 지정합니다. 예시는 다음과 같습니다.
Move-Item -Path <source file path>\<file name> -Destination <Destination path>
이동 과정에서 파일을 이름을 변경할 수도 있습니다.
시나리오 1 – 이름을 변경하지 않고 단일 파일 이동하기
이 cmdlet은 Test.txt 파일을 C:\Temp 디렉터리에서 C:\Backup 디렉터리로 파일 이름을 변경하지 않고 이동합니다:
Move-Item -Path C:\Temp\test.txt -Destination C:\Backup
시나리오 2 – 단일 파일을 이동하고 이동 과정에서 파일 이름을 변경하기
이 cmdlet은 Test.txt 파일을 C:\Temp 디렉터리에서 C:\Backup 디렉터리로 이동하되, 이름을 UseCase.txt으로 변경합니다:
Move-Item -Path C:\Temp\test.txt -Destination C:\Backup\UseCase.txt
여러 파일 이동
Move-Item cmdlet에서 와일드카드를 사용하면 한 번에 여러 항목(예: 여러 파일)을 한 위치에서 다른 위치로 옮길 수 있습니다. 예를 들어 동일한 확장자를 가진 모든 파일을 한 위치에서 다른 위치로 쉽게 이동할 수 있습니다.
시나리오 1 – 와일드카드를 사용해 동일한 확장자의 모든 파일 이동
이 cmdlet은 C:\Temp 디렉터리에서 모든 텍스트 파일(*.txt)을 C:\Backup 디렉터리로 이동하며, 다른 모든 파일은 그대로 둡니다:
Move-Item -Path C:\Temp\*.txt -Destination C:\Backup
시나리오 2 – 확장자와 무관하게 모든 파일 이동
소스 디렉터리에서 폴더가 아닌 모든 파일만 필터링하려면 -File 매개변수와 함께 Get-ChildItem cmdlet을 사용합니다. 그런 다음 결과를 Move-Item cmdlet으로 파이프하여 필터링된 파일을 대상 디렉터리로 이동하고, 모든 폴더는 그대로 둡니다.
다음 cmdlet에서 -File 매개변수는 C:\Temp 디렉터리에 있는 파일만 필터링합니다. 그런 다음 Move-Item cmdlet이 해당 파일을 C:\Temp에서 C:\Backup 디렉터리로 이동하며, C:\Temp에 폴더는 그대로 둡니다:
Get-ChildItem -Path C:\Temp\* -File | Move-Item -Destination C:\Backup
시나리오 3 – 특정 파일 이동
동일하거나 다른 확장자를 가진 특정 파일을 이동하는 것도 가능합니다. 이 경우 여러 값을 쉼표로 구분하여 경로 배열을 제공하는 방식으로 여러 파일을 지정해야 합니다.
이 cmdlet은 Test.txt 및 UseCase.pdf라는 이름의 두 파일을 C:\Temp 폴더에서 C:\Backup 폴더로 이동합니다:
Move-Item -Path C:\Temp\test.txt, C:\Temp\UseCase.pdf -Destination C:\Backup
디렉터리 이동
PowerShell의 Move-Item cmdlet은 디렉터리의 모든 내용(파일, 폴더, 하위 폴더)을 다른 디렉터리로 이동할 만큼 강력합니다. 또는 모든 내용을 이동하되 빈 디렉터리는 그대로 두도록 선택할 수도 있습니다. 두 경우 모두 원본의 폴더 구조가 대상 위치로 복사됩니다.
시나리오 1 – 모든 콘텐츠와 함께 전체 디렉터리 이동
이 cmdlet은 Temp 폴더와 그 안의 내용을 C:\Backup 폴더로 이동합니다.
Move-Item -Path C:\Temp -Destination C:\Backup
Temp 폴더가 C:\ 에서 삭제되고 Backup 디렉터리에 배치된다는 점에 유의하세요.
시나리오 2 – 디렉터리는 그대로 두고 디렉터리의 모든 콘텐츠만 이동
이 cmdlet은 Keys 디렉터리에서 모든 파일과 폴더를 재귀적으로 C:\Backup 폴더로 이동합니다.
Move-Item -Path C:\Temp\Keys\* -Destination C:\Backup
이 경우에는 소스 디렉터리(Keys)가 그대로 남아 있는 반면, 그 안의 모든 콘텐츠는 이동된다는 점에 유의하세요. 이 cmdlet은 소스 디렉터리를 비워 둬야 합니다.
파일을 네트워크 위치로 이동
Move-Item cmdlet은 파일을 네트워크 위치로도 이동할 수 있습니다. 대상(목적지)으로 네트워크 경로를 간단히 제공하기만 하면 됩니다.
다음 사항을 고려하세요.
- 네트워크 위치에 액세스하는 데 필요한 권한이 있어야 합니다.
- cmdlet을 실행하는 컴퓨터에서 네트워크 경로에 액세스할 수 있어야 합니다.
- 네트워크 위치에서 인증이 필요한 경우 다음 중 하나를 수행해야 합니다:
- New-PSDrive cmdlet을 사용하여 먼저 네트워크 드라이브를 매핑하거나 Windows 탐색기를 통해 수동으로 매핑합니다.
- 네트워크 리소스에 액세스할 때 자격 증명을 지정합니다.
시나리오 1 – 파일을 네트워크 위치로 이동
이 cmdlet은 Text.txt 파일을 C:\Temp 에서 네트워크 위치로 이동하며, 이 네트워크 위치는 Backup 이라는 폴더이고 FileServer 서버에 있습니다.
Move-Item -Path C:\Temp\test.txt -Destination \\FileServer\Backup
시나리오 2 – 파일을 이동할 때 덮어쓰기를 방지
Move-Item cmdlet으로 파일을 네트워크 위치로 이동할 때, -Force 매개변수를 제공하지 않더라도 파일 이름이 같으면 PowerShell이 기존 파일을 덮어씁니다.
덮어쓰기를 방지하려면 파일을 이동하기 전에 확인을 추가하세요.
if (-not (Test-Path "\\FileServer\Backup\test.txt")) {
Move-Item -Path "C:\Temp\test.txt" -Destination "\\FileServer\Backup"
}
else {
Write-Host "A file with the same name already exists in the destination."
}
Test-Path는 대상 위치에 파일이 이미 존재하는지 확인합니다. 예이면 파일을 이동하지 않고 ad 대신 알려줍니다.
초보자를 위한 Windows PowerShell 스크립팅 튜토리얼(PDF)
자세히 알아보기재귀적으로 파일 이동
PowerShell의 Move-Item cmdlet은 -Recurse 매개변수와 함께 사용할 수 있습니다. 그러면 해당 디렉터리와 그 안의 모든 폴더 및 하위 폴더에서 모든 파일을 다른 위치로 이동할 수 있습니다. 또한 이동 기능을 특정 확장자의 파일로 제한할 수도 있습니다.
시나리오 1 – 동일한 확장자를 가진 모든 파일을 재귀적으로 이동
이 cmdlet은 C:\Temp 디렉터리와 해당 하위 폴더에서 모든 PDF 파일을 재귀적으로 이동하여 C:\Backup 디렉터리에 저장합니다.
Get-ChildItem -Path C:\Temp\*.pdf -Recurse | Move-Item -Destination C:\Backup
여기서 Get-ChildItem cmdlet은 C:\Temp 디렉터리와 해당 하위 폴더에서 *.pdf 파일 확장자를 가진 하위 항목을 가져옵니다. 검색을 재귀적으로 수행하기 위해 -Recurse 매개 변수를 사용합니다.
파이프(|)는 결과를 Move-Item cmdlet으로 전달하며, Move-Item은 pdf 파일을 Backup 디렉터리로 이동합니다.
참고: 기본적으로 Get-ChildItem은 숨김 파일을 이동하지 않습니다. 이를 위해 Get-ChildItem과 함께 -Force 매개 변수를 사용한 다음, 결과를 Move-Item으로 파이프하세요.
시나리오 2 – 모든 파일을 재귀적으로 이동
Get-ChildItem cmdlet과 함께 -Recurse 매개 변수를 사용하면 한 디렉터리에서 다른 디렉터리로 파일을 재귀적으로 이동할 수 있습니다.
이 cmdlet은 C:\Temp 디렉터리와 그 하위 디렉터리의 모든 파일을 C:\Backup 디렉터리로 이동합니다. -Recurse 매개변수는 지정된 경로의 모든 하위 디렉터리를 검색하는 데 사용되고, -File 매개변수는 폴더를 제외한 파일만 검색하도록 cmdlet을 제한합니다.
Get-ChildItem -Path C:\Temp -Recurse -File | Move-Item -Destination C:\Backup
이 cmdlet은 파일만 이동한다는 점에 유의하세요. 폴더나 하위 폴더는 영향을 받지 않습니다. 또한 이 cmdlet은 파일을 대상 디렉터리의 루트로 이동하며, 대상 위치에서 원본 디렉터리의 폴더 구조를 생성하지 않습니다.
파일 필터링
Move-Item cmdlet을 사용해 항목을 이동하는 동안 특정 기준에 따라 항목을 필터링할 수 있습니다. 예를 들어, 원본 디렉터리에서 특정 파일을 그대로 유지하거나 특정 이름 또는 확장자에 해당하는 파일만 이동하려는 경우가 있을 수 있습니다. 이러한 작업에는 -Filter, -Include, -Exclude 매개변수가 유용합니다.
- -Include 매개변수는 이동할 파일 중에서 특정 속성에 해당하는 파일을 포함하도록 사용됩니다. 예를 들어 파일 이름( c:\temp\test* ) 또는 확장자( *.txt )를 속성으로 지정하면, 지정한 속성에 일치하는 파일만 대상 위치로 이동합니다.
- -Exclude 매개 변수는 특정 속성과 일치하는 파일을 이동 대상에서 제외하는 데 사용됩니다. 예를 들어 파일 이름( c:\temp\test*) 또는 확장자( *.txt )를 속성으로 지정할 수 있으며, 그러면 지정한 속성과 일치하는 파일은 대상 위치로 이동되지 않습니다.
- -Filter 매개 변수는 -Include 매개 변수와 유사하지만, -Include보다 더 빠르고 효율적입니다.
다음 사항을 확인하세요:
- 특정 데이터를 포함, 제외 또는 필터링하려면 폴더의 전체 콘텐츠를 사용해야 합니다.
- 이러한 매개 변수는 와일드카드와 함께 사용할 수 있습니다.
참고:
아래 시나리오에 제공된 cmdlet을 실행하기 전에 최신 PowerShell 버전을 사용하고 있는지 확인하세요. 그렇지 않은 경우 원활하게 작동할 수 있도록 PowerShell 버전을 업데이트하십시오.
시나리오 1 – 특정 확장자의 파일 제외
이 cmdlet은 C:\Temp 폴더의 모든 파일을 Backup 폴더로 이동하되, .txt 확장자를 가진 파일은 제외합니다.
Move-Item -Path C:\Temp\* -Exclude *.txt -Destination C:\Backup
마찬가지로 아래 cmdlet에서 -Filter 매개변수는 C:\Temp 에서 C:\Backup 로 모든 .docx 파일을 이동합니다.
Move-Item -Path C:\Temp\* -Filter *.docx -Destination C:\Backup
시나리오 2 – 특정 확장자의 파일 이동
이 cmdlet은 C:\Temp 폴더에서 텍스트 파일(.txt)만 Backup 폴더로 이동합니다.
Move-Item -Path C:\Temp\* -Include *.txt -Destination C:\Backup
유사한 기능은 '여러 파일 이동' 섹션을 참조하세요.
시나리오 3 – 특정 문자열로 시작하는 파일 이동
이 cmdlet은 이름이 “log”로 시작하는 파일을 이동합니다. “log”로 시작하지 않는 파일은 C:\Temp 에서 이동하지 않습니다.
Move-Item -Path C:\Temp\* -Include log* -Destination C:\Backup
고급 이동 시나리오
Move-Item PowerShell cmdlet은 파일 크기, 수정 날짜 등 특정 기준에 따라 파일을 이동할 수도 있습니다. 이를 위해 다음 방법 중 어떤 것이든 선택할 수 있습니다:
- -Filter 매개 변수를 사용
- 이동하기 전에 Get-ChildItem과 Where-Object를 함께 사용하여 특정 속성 또는 날짜 속성이 있는 파일을 선택합니다. 다음의 3단계 프로세스를 따릅니다:
- Get-ChildItem cmdlet은 소스 위치에서 파일을 가져옵니다.
- 파일 크기 또는 마지막 수정 날짜 같은 속성을 필터링하려면, 출력을 Where-Object cmdlet으로 파이프합니다.
- 다음으로 필터링된 파일을 이동하려면 출력물을 Move-Item cmdlet에 파이프(연결)하세요.
따라서 5 GB보다 큰 파일을 이동하려면 Get-ChildItem로 파일을 찾고, Where-Object 로 필터한 다음 Move-Item로 이동합니다.
시나리오 1 – 최근 X일 동안 수정된 파일 및 폴더 이동
이 cmdlet은 최근 30일 동안 수정된 모든 파일과 폴더를 C:\Temp 디렉터리에서 C:\RecentFiles 디렉터리로 이동합니다.
Get-ChildItem -Path C:\Temp\* | Where-Object {$_.LastWriteTime -gt (Get-Date).AddDays(-30)} | Move-Item -Destination C:\RecentFiles
이제 Get-ChildItem 및 Move-Item cmdlet은 익숙할 것입니다. 이제 Where-Object로 들어가 봅시다. 이 cmdlet은 최근 30일 동안 수정된 항목을 필터링합니다.
- $_는 Get-ChildItem에서 전달되는 각 개체(파일 또는 폴더)를 나타냅니다.
- LastWriteTime은 파일/디렉터리의 속성으로, 해당 항목이 수정되었거나 기록된 마지막 시간을 표시합니다.
- (Get-Date).AddDays(-30)은 현재 날짜를 가져온 다음 그로부터 30일을 뺍니다.
시나리오 2 – 특정 크기보다 큰 파일 및 폴더 이동
이 cmdlet은 2GB보다 큰 모든 파일과 폴더를 C:\Temp 디렉터리에서 C:\LargeFiles 디렉터리로 이동합니다.
Get-ChildItem -Path C:\Temp\* | Where-Object {$_.Length -gt 2GB} | Move-Item -Destination C:\LargeFiles
폴더 구조 유지
Move-Item cmdlet은 원본에서 대상 경로로 전체 폴더 구조를 그대로 복사하거나 다시 생성하지 않습니다. 하지만 파일을 대상 위치로 이동하면서 폴더 구조를 유지하는 방법이 몇 가지 있습니다:
- Move-Item cmdlet을 Copy-Item 및(필요 시) 검증 후 Remove-Item 같은 다른 cmdlet과 결합하기
- 폴더 구조를 수동으로 다시 만들기
시나리오 1 – 디렉터리를 내용과 폴더 구조가 그대로 유지된 상태로 이동하기
디렉터리의 모든 콘텐츠와 폴더 구조를 그대로 유지한 채로 이동하려면 'Move a Directory' 섹션을 참고하세요.
시나리오 2 – 폴더 구조를 보존하면서 특정 파일만 이동하기
PowerShell은 더 복잡한 기능을 지원하므로, 대상 위치에서 폴더 구조를 다시 생성하면서 특정 파일만 이동할 수 있습니다.
This script moves specific files (e.g., .pdf files) while keeping the folder structure intact:
Get-ChildItem -Path "C:\Temp" -Recurse -Filter "*.pdf" | ForEach-Object {
$destinationPath = $_.FullName.Replace("C:\Temp", "C:\Backup")
$destinationDir = Split-Path $destinationPath
if (-not (Test-Path $destinationDir)) {
New-Item -ItemType Directory -Path $destinationDir
}
Move-Item -Path $_.FullName -Destination $destinationPath
}
여기서 Get-ChildItem -Recurse는 하위 폴더를 포함하여 원본 디렉터리의 모든 .pdf 파일을 가져옵니다. ForEach-Object는 발견된 각 파일을 순서대로 처리합니다.
Replace(“C:\Temp”, “C:\Backup”)는 소스 경로를 조정하여 대상 위치에 해당 경로를 생성하고, New-Item -ItemType Directory는 대상 디렉터리가 존재하지 않는 경우 폴더 구조를 만듭니다.
덮어쓰기 처리
가끔은 기존 파일을 덮어써야 할 수 있습니다. 이를 위해 PowerShell Move-Item cmdlet과 함께 -Force 매개 변수를 사용하세요.
시나리오 1 – 대상 위치의 파일을 덮어쓰기
이 cmdlet은 test.txt 파일을 C:\Temp 폴더에서 C:\Backup 폴더로 이동하되, 동일한 이름으로 대상 위치에 이미 존재할 수 있는 파일은 덮어씁니다.
Move-Item -Path C:\Temp\test.txt -Destination C:\Backup\test.txt -Force
시나리오 2 – 확인 후 대상 위치의 파일을 덮어쓰기
파일을 덮어쓰기 전에 확인 프롬프트가 표시되도록 -Confirm 매개 변수를 사용하세요.
- 이 cmdlet은 대상 폴더에 이미 PDF 파일이 하나라도 있는 경우 확인 프롬프트를 표시합니다.
Move-Item -Path C:\Temp\*.pdf -Destination C:\Backup -Confirm -Force
- 이 cmdlet은 대상 폴더에 test.txt 파일이 이미 있는 경우 확인 프롬프트를 표시합니다.
Move-Item -Path C:\Temp\test.txt -Destination C:\Backup -Confirm -Force
Y 를 입력하고 Enter를 눌러 파일을 덮어쓰거나, N 을 입력하고 Enter를 눌러 건너뛰세요.
실행 전에 명령 테스트
Move-Item cmdlet과 함께 -WhatIf 매개 변수를 사용하면 결과를 확인할 수 있습니다. 즉, cmdlet을 실행했을 때 어떤 일이 발생하는지 확인하는 것입니다. 이 매개 변수에서는 cmdlet이 실행되지 않지만 예상 결과는 표시됩니다. 따라서 cmdlet이 의도되지 않은 항목은 이동하지 않는다는 점을 확신할 수 있습니다.
시나리오 1 – cmdlet을 실행하지 않고 예상 결과 보기
이 cmdlet은 Move-Item cmdlet을 사용하여 C:\Temp 폴더에 있는 모든 항목을 Backup 폴더로 이동하려고 할 때 표시되는 결과를 보여줍니다.
Move-Item -Path C:\Temp\* -Destination C:\Backup -WhatIf
오류 처리 및 로깅
PowerShell의 Move-Item cmdlet을 사용할 때는 스크립트가 예상대로 동작하는지 확인하고, 발생한 문제를 쉽게 추적하고 식별할 수 있도록 오류 처리 및 로깅을 구현하는 것을 고려해야 합니다. PowerShell은 다음을 제공합니다:
- 오류 처리를 위한 Try-Catch
- Write-Log: 로그 파일에 쓰기
Try-Catch를 사용한 기본 오류 처리
다음은 오류 처리를 포함하여 파일을 이동하기 위한 기본 Try-Catch 블록입니다:
Try {
Move-Item -Path C:\Temp\test.txt -Destination C:\Backup\test.txt -ErrorAction Stop
} Catch {
Write-Output "Error moving file: $_"
}
다음은 꼭 알아야 할 내용입니다.
- Try 블록은 Move-Item cmdlet을 실행하려고 시도합니다.
- -ErrorAction Stop 매개 변수는 문제가 발생할 경우(예: 파일이 존재하지 않거나 권한 문제가 있는 경우) PowerShell이 작업을 중지하고 오류를 발생시킨 다음 Catch 블록으로 진입하도록 지시합니다.
- -Catch 블록은 Move-Item cmdlet이 발생시키는 오류를 포착합니다.
- Write-Output은 오류 메시지를 표시합니다(($_에는 오류 세부 정보가 포함됨). 또한 Write-Output을 Write-Log 같은 로깅 함수로 바꾸면 오류를 로그 파일에 저장할 수 있습니다.
-ErrorAction 매개 변수는 오류가 발생했을 때 어떻게 처리할지를 지정합니다. 가능한 값은 다음과 같습니다:
- 중지 – 오류가 발생하면 작업이 중지됩니다
- 계속 – 오류가 발생해도 작업은 계속됩니다
- 조용히 계속 – 작업은 아무것도 표시하지 않고 오류를 무시합니다
- 문의 – 오류가 발생하면 사용자에게 입력을 요청합니다
- 무시 – 오류를 무시합니다
Active Directory 그룹 관리 모범 사례
자세히 알아보기PowerShell을 사용한 파일 관리 모범 사례
cmdlet을 한 개의 원본 및 대상 폴더로 제한하세요
Move-Item cmdlet은 대상에 폴더나 디렉터리 구조를 생성하지 않습니다. 또한 서로 다른 두 원본 위치에서 같은 이름의 파일 두 개를 동시에 이동할 수도 없습니다. 따라서 cmdlet에서는 하나의 원본 폴더와 하나의 대상 폴더를 지정하는 것이 가장 좋습니다.
파일 구성 계획 수립
특히 대량으로 파일을 이동하기 전에 파일 구성(정리) 구조를 명확히 파악해야 합니다. 먼저, 원본 디렉터리는 파일과 폴더가 적절히 유지/정리되어 있어야 하므로 항목을 이동할 때 무엇이 이동되는지 알 수 있습니다. 둘째, 대상(목적지) 위치의 폴더 구조는 명확하게 정의되어 있어야 하며, 그래야 모든 항목이 원하는 대로 이동됩니다. 이렇게 하면 이동한 각 파일을 쉽게 찾을 수 있습니다.
샘플 데이터로 cmdlet을 테스트하세요
샘플 데이터에서 Move-Item cmdlet을 테스트하여 결과가 기대한 대로 나오는지 확인하세요. 이를 통해 덮어쓰기(overwrites)나 충돌(conflicts)에 대한 누락을 방지하는 데 도움이 됩니다.
샘플 데이터가 충분하지 않거나 시간을 절약하고 싶다면 -WhatIf 매개 변수를 사용해 cmdlet을 실제로 실행하지 않고 이동을 시뮬레이션하세요. 이렇게 하면 변경을 수행하기 전에 cmdlet과 스크립트를 테스트하여 결과를 확인할 수 있습니다.
백업을 유지하세요
예방 조치로, Move-Item cmdlet을 사용하기 전에 특히 덮어쓰기(overwrite)되는 항목을 포함해 모든 중요한 파일과 폴더를 백업하세요. 나중에 혼란을 겪지 않기 위해서입니다.
로깅 및 오류 처리 구현
로깅 및 오류 처리는 예상치 못한 오류를 처리하는 데 유용한 도구입니다. 이를 구현하면 Move-Item 작업에서 발생한 모든 오류를 식별하고 추적하는 데 도움이 됩니다.
오류 처리를 위해 cmdlet에서 -ErrorAction 매개 변수 또는 try-catch 블록을 사용할 수 있습니다.
결론
PowerShell의 Move-Item cmdlet은 파일을 관리하고 정리할 때 마법사처럼 강력한 기능을 제공합니다. 기본 문법이 간단해 초보자와 고급 사용자 모두를 만족시키며, 매개변수와 스크립트를 통해 기능을 확장해 나갈 수 있습니다. 단일 파일, 여러 파일, 숨김 및 읽기 전용 파일을 다른 위치로 이동할 수 있고, 해당 디렉터리의 전체 내용을 통째로 옮길 수도 있습니다. 이동하는 동안 파일 이름을 바꾸거나, 덮어쓰기 처리를 수행하는 등 다양한 작업도 가능합니다. 또한 이 cmdlet은 로깅과 오류 처리를 지원하여 파일 이동이 안정적이고 안전하게 이루어지도록 보장합니다.
Netwrix Directory Manager
자주 묻는 질문
대상 위치에 동일한 이름의 파일이 이미 존재하면 어떻게 되나요?
Move-Item cmdlet을 사용해 파일을 이동하려고 할 때, 대상 위치에 이미 같은 이름의 파일이 존재하면 다음 중 하나가 발생합니다:
- Move-Item cmdlet을 -Force 매개변수 없이 실행합니다:
Move-Item -Path C:\Temp\test.txt -Destination C:\Backup\test.txt
cmdlet에서 오류가 발생하며 파일이 이동되지 않습니다.
- -Force 매개변수를 사용하는 경우:
Move-Item -Path C:\Temp\test.txt -Destination C:\Backup\test.txt -Force
PowerShell은 확인을 요청하지 않고 대상 위치의 파일을 덮어씁니다. 즉, 대상 위치의 파일을 이동 중인 파일로 바꿉니다.
추가 정보는 Handle Overwrites 섹션을 참조하세요.
한 번에 여러 파일을 이동할 수 있나요?
네, PowerShell의 Move-Item으로 가능합니다. 다음을 수행할 수 있습니다:
- 동일한 확장자의 파일, 서로 다른 확장자의 파일, 그리고 소스 디렉터리 루트에 있는 모든 파일을 이동할 수 있습니다. 다음 cmdlet을 사용하면 소스 디렉터리 루트에 있는 모든 파일을 이동할 수 있습니다:
Get-ChildItem -Path C:\Temp\* -File | Move-Item -Destination C:\Backup
자세한 내용은 'Move Multiple Files' 섹션을 참조하세요.
- 소스 디렉터리에서 동일한 확장자의 모든 파일을 하위 폴더까지 재귀적으로 이동하려면 다음 cmdlet을 사용하세요:
Get-ChildItem -Path C:\Temp\*.pdf -Recurse | Move-Item -Destination C:\Backup
자세한 내용은 ‘Recursive File Moving’ 섹션을 참조하세요.
- 다음 cmdlet을 사용하여 소스 디렉터리를 그 안의 모든 콘텐츠와 함께 이동합니다:
Move-Item -Path C:\Temp -Destination C:\Backup
자세한 내용은 ‘Move a Directory’ 섹션을 참조하세요.
특정 속성을 가진 파일을 어떻게 이동하나요?
Move-Item cmdlet은 파일 크기, 수정 날짜 등 특정 기준에 따라 파일을 이동할 수 있습니다. 다음은 필터링할 수 있는 일반적인 속성 목록입니다:
- 숨김
- 읽기 전용
- 보관
- 압축됨
- 암호화됨
이 값을 Where-Object 필터에서 사용하여 해당 특성을 가진 파일을 대상으로 지정할 수 있습니다. 또한 Where-Object에서 -and 또는 -or를 사용해 여러 조건을 조합하면, 여러 특성을 가진 파일을 필터링할 수도 있습니다.
추가 정보는 '필터 파일(Filter Files)' 및 '고급 이동 시나리오(Advanced Moving Scenarios)' 주제를 참고하세요.
Move-Item을 사용해 서로 다른 드라이브 간에 파일을 이동할 수 있나요?
간단히 말해, 네. 파일은 원본 드라이브와 동일하든 다른 드라이브든 상관없이, 목적지로 지정한 위치로 이동됩니다.
Move-Item을 사용해 파일을 이동하면서 덮어쓰려면 어떻게 해야 하나요?
대상(목적지)에 있는 파일을 이동 중인 파일로 덮어쓰려면 Move-Item에서 -Force 매개 변수를 사용하세요. 예:
Move-Item -Path C:\Temp\test.txt -Destination C:\Backup\test.txt -Force
PowerShell은 확인을 묻지 않고 Backup 폴더의 test.txt 파일을 Temp 폴더의 test.txt 파일로 바꿉니다. 추가 정보는 'Handle Overwrites' 섹션을 참조하세요.
PowerShell을 사용하여 숨김 파일을 이동하려면 어떻게 해야 하나요?
폴더를 이동하거나 동일한 확장자를 가진 여러 파일을 이동하는 동안 Move-Item cmdlet은 숨김 파일이나 읽기 전용 파일을 이동하지 않습니다. -Force 매개 변수를 사용하여 Get-ChildItem cmdlet로 출력에 숨김 및 시스템 파일을 포함한 다음, 결과를 Move-Item으로 파이프하세요.
예를 들어 이 cmdlet을 사용하면 숨김 파일을 포함한 모든 파일을 이동할 수 있습니다.
Get-ChildItem -Path C:\Temp\ -Force | Move-Item -Destination C:\Backup\
숨김 파일(표시되는 파일이 아님)만을 지정해서 이동하려면 이 cmdlet을 사용하세요:
Get-ChildItem -Path C:\Temp\ -Force | Where-Object { $_.Attributes -match 'Hidden' } | Move-Item -Destination C:\Backup\
숨김 파일을 필터링하도록 조건을 추가했으므로, 이 cmdlet은 “Hidden” 속성이 설정된 파일만 이동합니다.
Move-Item을 사용할 때 흔히 발생하는 오류는 무엇이며, 어떻게 해결(트러블슈팅)할 수 있나요?
아래에 설명과 해결 방법이 함께 제공되는 몇 가지 일반적인 오류를 소개합니다.
파일이 이미 존재합니다
파일이나 폴더를 동일한 이름의 파일이 이미 존재하는 대상 위치로 이동하려고 하면 다음 오류가 표시됩니다:
Move-Item : Cannot create a file when that file already exists.
기존 파일을 덮어쓰려면 -Force 매개 변수를 사용합니다.
Access Denied
파일을 이동하는 데 필요한 권한이 없으면 다음 오류가 표시됩니다:
Move-Item : Access to the path 'C:\Path\to\file.txt' is denied.
이에는 파일이 보호되어 있거나, 대상 폴더에 관리자 권한이 필요하거나, 또는 파일이 다른 프로세스에서 사용 중인 등 여러 가지 이유가 있을 수 있습니다.
문제를 해결하려면 필요한 권한이 있는지 확인하십시오. PowerShell을 관리자 권한으로 실행하는 것이 좋습니다. 또한 해당 파일이 다른 애플리케이션에서 사용 중이 아닌지 확인하십시오.
다른 프로세스가 파일을 잠금
이동하려는 파일이 다른 프로그램 또는 프로세스에서 사용 중이면 다음 오류가 표시됩니다:
Move-Item : The process cannot access the file because it is being used by another process.
문제를 해결하려면 해당 파일을 사용하는 애플리케이션을 모두 닫으십시오.
경로가 너무 깁니다
기본적으로 Windows의 최대 경로 길이는 260자이며, 원본 또는 대상 경로가 이 제한을 초과하면 Move-Item이 실패합니다. PowerShell은 다음 오류를 표시합니다:
Move-Item : The specified path, file name, or both are too long.
문제를 해결하려면 더 짧은 디렉터리 또는 파일 이름을 사용하거나 Windows 10/11 또는 Windows Server에서 Group Policy 또는 레지스트리를 통해 긴 경로 지원을 활성화하세요.
잘못된 경로 또는 파일 이름
원본 경로나 대상 경로가 올바르지 않거나 철자가 틀렸거나 존재하지 않으면 다음 오류가 표시됩니다:
Move-Item : Cannot find path 'C:\InvalidPath\file.txt' because it does not exist.
경로를 다시 한 번 확인하세요.
대상 디렉터리가 존재하지 않습니다
대상 디렉터리가 존재하지 않으면 다음 오류가 표시됩니다:
Move-Item : Could not find part of the path 'C:\Backup\'
대상 디렉터리가 존재하는지 확인하세요. 그렇지 않으면 파일을 이동하기 전에 먼저 생성하세요.
디렉터리를 자기 자신으로 이동
PowerShell은 디렉터리를 자신의 하위 디렉터리 중 하나로 이동하는 것을 허용하지 않습니다. 그렇게 시도하면 다음 오류가 표시됩니다:
Move-Item : Cannot move item 'C:\Temp\' to a subdirectory of itself, 'C:\Temp\Logs\'.
대상 위치가 원본 디렉터리의 하위 폴더가 아닌지 확인하세요.
파일의 내용에 따라 파일을 이동할 수 있나요?
그 자체로는 Move-Item cmdlet이 파일의 내용에 따라 파일을 이동할 수는 없습니다. 하지만 Get-Content 또는 조건부 논리(예: If-Else 문)를 사용해 다른 파일 읽기 방법으로 파일의 내용을 읽은 다음 Move-Item 를 사용해 그에 맞게 파일을 이동할 수 있습니다.
아래는 파일에 특정 단어 또는 구문이 포함되어 있는지 확인한 다음, 있으면 해당 파일을 이동하는 예제 스크립트입니다.
참고: 스크립트를 실행하기 전에 다음 변경 사항을 적용하세요:
- $searchString 변수를 필터링하려는 콘텐츠와 일치하도록 수정하세요.
- $sourceDirectory 및 $destinationDirectory를 적절한 경로로 변경하세요.
$sourceDirectory = "C:\SourceFolder"
$destinationDirectory = "C:\DestinationFolder"
$searchString = "SpecificText"
# Get all files in the source directory
Get-ChildItem -Path $sourceDirectory -File | ForEach-Object {
$filePath = $_.FullName
# Read the content of the file
$content = Get-Content -Path $filePath
# Check if the file contains the search string
if ($content -match $searchString) {
# Move the file to the destination directory
$destinationPath = Join-Path -Path $destinationDirectory -ChildPath $_.Name
Move-Item -Path $filePath -Destination $destinationPath
Write-Host "Moved file: $filePath to $destinationPath"
}
else {
Write-Host "File does not contain search string: $filePath"
}
}
Get-ChildItem은 소스 폴더의 모든 파일을 가져오고, ForEach-Object는 각 파일을 순회합니다. Get-Content는 각 파일의 내용을 읽어 해당 내용이 지정한 문자열과 일치하는지 확인합니다. 그런 다음 Move-Item은 문자열이 포함된 파일을 대상 폴더로 이동합니다.
이동하려는 파일이 없거나, 소스 경로가 유효하지 않다면 어떻게 될까요?
어느 경우든 PowerShell에서 오류가 발생합니다.
Move-Item : Cannot find path 'C:\Temp\AppLog.txt' because it does not exist.
마찬가지로 대상 경로의 구성 요소 중 하나라도 존재하지 않으면 cmdlet이 실패합니다. 누락된 디렉터리나 경로의 어떤 구성 요소도 생성하지 않습니다.
파일이 존재하는지 확인하려면 Test-Path를 실행해 보는 것이 좋습니다. 이 cmdlet은 경로의 모든 요소가 존재하면 $true를 반환하고, 하나라도 누락되면 $false를 반환합니다.
Test-Path -Path C:\Backups\AppLogs
False
공유하기
더 알아보기
저자 소개
Jonathan Blackwell
소프트웨어 개발 책임자
2012년부터 엔지니어이자 혁신가인 Jonathan Blackwell은 엔지니어링 리더십을 제공해 Netwrix GroupID를 Active Directory 및 Azure AD 환경에서 그룹 및 사용자 관리 분야의 최전선에 올려놓았습니다. 개발, 마케팅, 영업에서의 그의 경험을 통해 Jonathan은 Identity 시장과 구매자가 생각하는 방식까지 완전히 이해할 수 있습니다.