Step 2. 파일 다루기 — 만들고, 복사하고, 옮기고, 지우기
Level 0 — 컴퓨터 조작과 구조의 이해 | 난이도 ★☆☆☆☆ | 예상 소요 시간 2~3시간
전제: Step 1 완료 (파워쉘 열기,
pwd/ls/cd). 오늘도 윈도우 파워쉘에서 진행합니다.
- 준비물: 윈도우 PC, 파워쉘.
- 안전: 오늘의 모든 실험은 처음에 만드는 전용 연습 폴더 안에서만 합니다. 실수해도 아무 피해가 없는 안전지대입니다.
- 주의: 오늘의 주의 사항은 하나,
Remove-Item입니다. 파워쉘의 삭제는 휴지통을 거치지 않습니다. 지우는 순간 영구 삭제입니다. 그래서 오늘은 "지우는 법"보다 "안전하게 지우는 법"을 더 열심히 배웁니다.
파일 복사는 마우스로도 됩니다. 그런데 "이 폴더에서 .txt 파일만 300개 골라 복사해 줘"는 마우스로는 300번 클릭, 명령으로는 한 줄입니다. "매일 밤 로그를 백업 폴더로 옮겨 줘"는 자동화해야 하고, 원격 서버에는 아예 마우스가 없습니다. 보안 실무에서 파일 조작은 "문서 정리"가 아니라 증거 다루기입니다 — 수상한 파일을 격리하고(이동), 원본을 보존하고(복사), 분석이 끝나면 정리(삭제)하는 일의 기본기가 오늘 내용입니다.
1. 학습 목표
이 챕터를 끝내면 다음을 할 수 있습니다:
New-Item으로 파일과 폴더를 만든다Set-Content/Get-Content로 파일에 내용을 쓰고 읽는다Copy-Item(복사)과Move-Item(이동)의 차이를 구분해 쓴다- 와일드카드(
*)로 조건에 맞는 파일만 골라 작업한다 - 삭제 전
-WhatIf로 대상을 미리 확인하는 안전 습관을 쓴다
2. 배경 지식 — 오늘의 도구와 개념
오늘의 도구 한눈에 보기
| 구분 | 내용 |
|---|---|
| 언어·환경 | 파워쉘 5.1, 윈도우 파일 시스템 |
| 오늘의 명령어 | New-Item(만들기), Set-Content/Add-Content/Get-Content(쓰기·붙이기·읽기), Copy-Item(복사), Move-Item(이동), Remove-Item(삭제) |
| 오늘의 옵션 | -WhatIf(미리보기), -Recurse(하위까지), -Exclude(제외) |
| 필요한 개념 | 확장자, 와일드카드(*, ?), "복사 vs 이동", 영구 삭제의 의미 |
2-1. 확장자 — 파일의 꼬리표
파일 이름의 마지막 . 뒷부분을 확장자라고 합니다. report.txt의 .txt, setup.exe의 .exe처럼요. 이건 "이 파일이 어떤 종류인가"를 알려 주는 꼬리표입니다.
| 확장자 | 종류 |
|---|---|
.txt |
텍스트 문서 |
.exe |
실행 프로그램 |
.ps1 |
파워쉘 스크립트 |
.zip |
압축 파일 |
.log |
로그(기록) 파일 |
보안 주의점 하나: 윈도우는 기본 설정에서 확장자를 숨겨서 보여 줍니다. 그래서 견적서.pdf처럼 보이는 파일이 사실은 견적서.pdf.exe(실행 파일!)인 함정이 악성코드 유포의 고전 수법입니다. 탐색기 설정에서 "파일 확장명 표시"를 켜 두는 것 — 초보가 할 수 있는 가장 쉬운 보안 강화입니다. CLI에서는 ls를 치면 확장자가 항상 다 보이니 자연히 이 습관이 생깁니다.
2-2. 와일드카드 — "아무 글자나"의 기호
*(별표)는 "그 자리에 아무 글자나 몇 글자든 올 수 있다"는 특수 기호입니다. 트럼프의 조커 같은 겁니다.
| 패턴 | 뜻 | 걸리는 예 |
|---|---|---|
*.txt |
끝이 .txt인 모든 것 | a.txt, 일기.txt |
log* |
log로 시작하는 모든 것 | log1.txt, logfile.zip |
report?.txt |
report + 한 글자 + .txt | report1.txt, reportA.txt |
이 기호가 오늘의 핵심 무기입니다. "300개 중 txt만" 같은 조건 선택이 이걸로 됩니다.
3. 따라 하기
3-1. 연습장 만들기
오늘의 모든 실험은 전용 폴더 안에서 합니다. 파워쉘을 열고:
cd $HOME
New-Item -ItemType Directory practice
새 폴더 정보가 한 줄 출력됩니다. 확인:
ls
d----- 2026-09-08 오후 2:31 practice
맨 앞이 d — 폴더가 하나 생겼습니다. 명령을 뜯어 봅시다:
New-Item— "새 항목을 만들어라" (만들다 New + 항목 Item)-ItemType Directory— "만들 종류는 폴더" (생략하면 기본은 파일)
들어갑니다:
cd practice
pwd → C:\Users\Lee\practice
프롬프트 경로가 practice로 끝나는지 확인하세요. 오늘 이 경로가 아니면 명령을 치지 마세요 — 실험은 전부 여기서만입니다.
3-2. 파일 만들기와 내용 쓰기 — New-Item, Set-Content
빈 파일을 만듭니다:
New-Item test.txt
디렉터리: C:\Users\Lee\practice
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2026-09-08 오후 2:32 0 test.txt
Mode가 -a---- — 앞이 d가 아니니 파일입니다. 그리고 Length가 0 — 내용이 없는 빈 파일이라는 뜻입니다.
이제 내용을 넣어 봅시다:
Set-Content test.txt "hello security"
Set-Content— "내용을 설정하라" (설정 Set + 내용 Content)- 따옴표 안의 글자가 파일에 기록됩니다
제대로 들어갔는지 읽어 봅시다:
Get-Content test.txt
hello security
Get-Content는 "내용을 가져와라" — 파일 내용을 화면에 출력합니다. 지금까지의 흐름:
New-Item(만들기) → Set-Content(쓰기) → Get-Content(읽기)
이 세 개가 "파일에 뭔가 기록하고 확인하는" 기본 사이클입니다. 나중에 스크립트 실행 결과를 파일에 저장하고 확인할 때 이 사이클이 그대로 쓰입니다.
예측해 보기:
Set-Content test.txt "두 번째 글"를 치면,test.txt의 내용은 어떻게 될까요? 기존 "hello security" 뒤에 붙을까요, 아니면 바뀔까요? 예측한 뒤Get-Content로 확인하세요.
(정답: 바뀝니다. Set-Content는 덮어쓰기입니다. 이어 붙이고 싶으면Add-Content라는 별도 명령이 있습니다 — 한번 쳐 보세요.)
3-3. 복사하기 — Copy-Item
Copy-Item test.txt backup.txt
ls
-a---- 2026-09-08 오후 2:35 20 backup.txt
-a---- 2026-09-08 오후 2:35 20 test.txt
같은 크기의 파일이 둘입니다. 읽는 법: Copy-Item 원본 사본 — "test.txt를 복사해서 backup.txt라는 이름으로."
왜 보안에서 복사가 중요할까요? 원칙 하나: "분석은 사본으로, 원본은 절대 건드리지 않는다." 수상한 파일을 발견했을 때 원본을 직접 열거나 고치면 증거가 훼손됩니다. 반드시 복사해 두고 사본을 가지고 실험합니다. 포렌식(디지털 증거 분석)의 제1원칙이 Copy-Item에서 시작됩니다.
⚠️ 주의:
Copy-Item은 대상에 같은 이름의 파일이 이미 있으면 물어보지 않고 조용히 덮어씁니다 (실측 확인). 덮어쓰면 기존 내용은 사라집니다 — 사본 이름을 정할 때 "거기 같은 이름이 없나?"를ls로 먼저 확인하세요.
3-4. 폴더로 복사하기
복사 대상을 "파일 이름" 대신 "폴더"로 할 수도 있습니다. 먼저 백업 폴더를 만듭니다:
New-Item -ItemType Directory backup
Copy-Item test.txt backup\
ls backup
-a---- 2026-09-08 오후 2:36 20 test.txt
backup 폴더 안에 test.txt의 사본이 들어갔습니다. Copy-Item test.txt backup\은 "test.txt를 backup 폴더 안으로 (이름 그대로) 복사"라는 뜻입니다.
3-5. 이동하기 — Move-Item (그리고 이름 바꾸기)
Move-Item test.txt backup\moved.txt
Move-Item— "옮겨라" (이동 Move + 항목 Item)backup\moved.txt— "backup 폴더 안의 moved.txt라는 이름으로"
확인:
ls
d----- 2026-09-08 오후 2:37 backup
-a---- 2026-09-08 오후 2:35 20 backup.txt
test.txt가 사라졌습니다 — 복사와 달리 이동은 원본이 남지 않습니다. 어디 갔는지 확인:
ls backup
-a---- ... 20 moved.txt
-a---- ... 20 test.txt
Move-Item의 두 얼굴: 같은 폴더 안에서 쓰면 "이름 바꾸기"가 됩니다.
Move-Item backup.txt renamed.txt
ls → backup.txt가 renamed.txt로 바뀜
윈도우 탐색기의 "이름 바꾸기(F2)"가 사실은 "같은 위치로의 이동"이라는 게 이 관점에서 이해됩니다.
3-6. 와일드카드로 한꺼번에 — 실전 감각
이제 오늘의 진짜 무기를 씁니다. 실험용 파일을 여러 개 만듭니다 (쉼표로 나열하면 한 번에 여러 개):
New-Item a.txt, b.txt, c.txt, a.log, b.log
ls
-a---- ... 0 a.log
-a---- ... 0 a.txt
-a---- ... 0 b.log
-a---- ... 0 b.txt
-a---- ... 0 c.txt
...
해볼 것: 이 중에서 .txt 파일만 골라 backup 폴더에 복사해 보세요.
Copy-Item *.txt backup\
ls backup
-a---- ... 0 a.txt
-a---- ... 0 b.txt
-a---- ... 0 c.txt
...
.log 파일들은 빠지고 .txt만 쏙쏙 골라졌습니다. 300개여도 이 한 줄이면 됩니다 — 이게 마우스를 이기는 순간입니다.
예측해 보기:
Copy-Item a* backup2\는 뭘 복사할까요? (정답:a로 시작하는a.txt와a.log둘 다. 단 backup2 폴더가 없으면 파워쉘이 "backup2라는 파일로 복사"로 오해해서 엉뚱한 결과가 나옵니다 — 폴더 복사 전엔New-Item -ItemType Directory backup2로 폴더부터 만들어 두세요.)
3-7. 삭제하기 — Remove-Item, 그리고 안전장치 -WhatIf
자, 오늘의 가장 조심해야 할 명령입니다.
Remove-Item renamed.txt
ls → renamed.txt가 사라짐
휴지통을 거치지 않습니다. 탐색기에서 지우면 휴지통에 들어가서 복구할 수 있지만, Remove-Item은 그 자리에서 영구 삭제입니다. 그래서 습관이 필요합니다:
지우기 전에, 뭘 지울지 먼저 본다.
그 "미리 보기"를 해 주는 안전장치가 -WhatIf 옵션입니다. 어떤 Remove-Item이든 -WhatIf를 붙이면, 실제로 지우지 않고 "이걸 지웠을 것이다"라고 보여 줍니다.
New-Item victim1.txt, victim2.txt
Remove-Item victim*.txt -WhatIf
결과 (실측, 한글 윈도우):
WhatIf: 대상 "C:\Users\Lee\practice\victim1.txt"에서 "파일 제거" 작업을 수행합니다.
WhatIf: 대상 "C:\Users\Lee\practice\victim2.txt"에서 "파일 제거" 작업을 수행합니다.
"만약 실행했다면 이 두 파일을 지웠을 겁니다" — 의도한 목록이 맞는지 확인하고, 맞으면 -WhatIf를 떼고 진짜 실행:
Remove-Item victim*.txt
ls → 두 파일이 사라짐
폴더째 지우기: 폴더는 안이 비어 있지 않으면 그냥은 안 지워지고 확인을 묻습니다. 한 방에 지우려면 -Recurse(하위까지 전부)를 붙입니다:
Remove-Item backup2 -Recurse
⚠️ -Recurse는 강력한 만큼 위험합니다. "이 폴더 안에 정말 버릴 것만 있나?"를 ls로 먼저 보고, 가능하면 여기도 -WhatIf를 먼저 붙여 보세요.
4. 미션과 연습문제
미션 — 파일 관리자 시험
practice 폴더 안에서, 오늘 배운 것만으로 다음을 수행하세요:
project라는 폴더를 만들고 들어가세요.- 그 안에
plan.txt,memo.txt,data.csv,run.log네 파일을 만드세요. plan.txt에 "이것은 계획서다"라고 내용을 쓰고, 읽어서 확인하세요.archive폴더를 만들고, .txt 파일만 그곳에 복사하세요. (plan.txt원본은 남아 있어야 합니다.)run.log를archive폴더로 이동하세요. (원본 위치에는 없어야 합니다.)data.csv를-WhatIf로 삭제 시뮬레이션한 뒤, 진짜로 삭제하세요.- 마지막에
ls와ls archive결과가 이렇게 되는지 확인하세요:- 현재 폴더:
plan.txt,memo.txt,archive - archive 안:
plan.txt,memo.txt,run.log
- 현재 폴더:
연습문제
문제 1. Copy-Item과 Move-Item의 차이를 한 문장으로 설명하세요.
문제 2. 현재 폴더에 a.txt, b.txt, c.log가 있습니다. Copy-Item *.* backup\ 대신 .log만 빼고 복사하고 싶습니다. 두 가지 방법을 써 보세요.
문제 3. Remove-Item *.txt -WhatIf를 쳤더니 지우려던 파일 외에 notes.txt까지 목록에 나왔습니다. 어떻게 해야 할까요?
문제 4. Set-Content a.txt "첫째" 다음에 Set-Content a.txt "둘째"를 쳤습니다. a.txt의 내용은? 이어 붙이려면 어떤 명령을 써야 할까요?
5. 모범 답안과 완료 기준
미션 해설
New-Item -ItemType Directory project
cd project
New-Item plan.txt, memo.txt, data.csv, run.log
Set-Content plan.txt "이것은 계획서다"
Get-Content plan.txt
New-Item -ItemType Directory archive
Copy-Item *.txt archive\
Move-Item run.log archive\
Remove-Item data.csv -WhatIf
Remove-Item data.csv
ls
ls archive
검증하는 법: 마지막 두 ls 결과가 미션 7번의 기대 상태와 정확히 일치하면 완료입니다. plan.txt가 양쪽에 있는 게 포인트입니다(복사는 원본이 남으니까요). run.log는 archive에만 있어야 하고, data.csv는 어디에도 없어야 합니다.
연습문제 해답
문제 1 해답. 복사(Copy-Item)는 원본이 그대로 남고, 이동(Move-Item)은 원본이 사라지고 대상 위치로 옮겨갑니다. (같은 폴더 안 Move-Item은 "이름 바꾸기"가 됩니다.)
문제 2 해답.
- 방법 1 (와일드카드):
Copy-Item *.txt backup\ - 방법 2 (제외 옵션):
Copy-Item * backup\ -Exclude *.log
문제 3 해답. -WhatIf를 떼지 말고 멈춥니다. WhatIf 목록 = 실제 삭제될 목록이므로, 패턴을 좁혀서(예: 파일명 공통 부분만 victim*.txt처럼) 다시 -WhatIf로 확인한 뒤, 정확한 목록이 나올 때만 진짜 실행합니다. 이것이 WhatIf를 쓰는 이유입니다.
문제 4 해답. 내용은 둘째뿐입니다 — Set-Content는 덮어쓰기입니다. 이어 붙이려면 Add-Content a.txt "둘째"를 씁니다.
완료 기준 체크리스트
- [ ]
New-Item으로 파일과 폴더를 둘 다 만들 수 있다 - [ ]
Set-Content로 쓰고Get-Content로 확인하는 사이클을 할 수 있다 - [ ] 복사(Copy)와 이동(Move)의 차이를 설명할 수 있다
- [ ]
*.txt같은 와일드카드로 파일을 골라 작업할 수 있다 - [ ] 삭제 전에
-WhatIf로 미리 보는 습관을 체험했다 - [ ] 미션 1~7의 최종 상태를 정확히 만들었다
6. 흔한 실수와 해결
벽 1. "중요한 파일을 Remove-Item으로 지웠다!"
예방이 유일한 답입니다. 복구 방법이 아주 없는 건 아니지만(복구 도구, 백업), 성공률이 낮습니다. 그래서 오늘부터의 철칙:
- 지우기 전
ls로 대상 확인 - 와일드카드로 지울 땐 반드시
-WhatIf먼저 - 중요한 건 지우지 말고
Move-Item으로 "휴지 폴더"에 옮기는 습관
벽 2. Copy-Item을 쳤더니 원본이 아니라 엉뚱한 게 생겼다
대상 폴더가 없는 상태에서 Copy-Item a.txt backup\처럼 치면, 파워쉘이 backup을 폴더가 아니라 새 파일 이름으로 알아듣는 경우가 있습니다. 폴더로 복사할 때는 대상 폴더를 먼저 만들고(New-Item -ItemType Directory backup), 복사 후 ls backup으로 확인까지 한 세트로 하세요.
벽 3. 경로에 공백이 있어서 명령이 깨진다
Step 1의 규칙 그대로입니다: Copy-Item "my file.txt" backup\처럼 따옴표로 감싸세요. 오늘부터 파일/폴더 이름을 지을 때 공백 대신 -나 _를 쓰는 습관도 CLI 생활을 편하게 합니다. (그래서 개발자들의 파일명에 언더스코어가 많은 겁니다.)
벽 4. 와일드카드가 생각보다 많이(적게) 선택된다
*가 잡아내는 범위를 확신할 수 없을 때는, 지우거나 덮기 전에 선택만 먼저 해 보세요: ls *.txt. 이 목록이 그대로 작업 대상입니다. "선택 확인 → 작업" 순서를 몸에 배도록 하세요.
벽 5. Move-Item으로 옮겼는데 원본이 없어서 당황했다
이동은 원본이 사라지는 게 정상입니다. 원본을 남기고 싶었던 거라면 그건 복사(Copy-Item)의 일이었습니다. 옮긴 위치를 까먹었다면 ls를 이리저리 치지 말고, ↑ 키로 방금 친 명령을 다시 보세요 — 거기 목적지가 적혀 있습니다.
7. 정리
오늘 배운 명령어
| 명령 | 하는 일 | 예 |
|---|---|---|
New-Item |
파일/폴더 만들기 | New-Item a.txt, New-Item -ItemType Directory dir |
Set-Content |
내용 쓰기 (덮어쓰기) | Set-Content a.txt "글" |
Add-Content |
내용 이어 붙이기 | Add-Content a.txt "글" |
Get-Content |
내용 읽기 | Get-Content a.txt |
Copy-Item |
복사 (원본 남음, 같은 이름 덮어씀) | Copy-Item *.txt backup\ |
Move-Item |
이동/이름 바꾸기 (원본 사라짐) | Move-Item a.txt backup\b.txt |
Remove-Item |
삭제 (휴지통 없음) | Remove-Item *.log -WhatIf |
핵심 개념
| 개념 | 한 줄 요약 |
|---|---|
| 확장자 | 파일 종류의 꼬리표. 항상 보이게 하라 |
와일드카드 * |
"아무 글자나" — 조건 선택의 무기 |
| -WhatIf | 실행 전 시뮬레이션. 삭제의 안전벨트 |
| -Recurse | 폴더째 통째로 (하위까지) |
명령어보다 중요한 감각
"지우기 전에 보고, 보고 나서 지운다." 그리고 "분석은 사본으로, 원본은 보존." 이 두 문장은 파일 조작을 넘어 침해 대응 실무의 철칙입니다.
알아두면 좋은 것 하나: Remove-Item으로 지워도 디스크에는 흔적이 남아 복구 도구로 되살릴 수 있습니다. 포렌식 조사관이 "삭제된 파일 복구"를 중요 기술로 쓰는 이유이고, 반대로 민감한 파일을 진짜로 없앨 때는 여러 번 덮어쓰는 와이핑(wiping) 도구를 씁니다. "삭제란 무엇인가"는 Level 3 포렌식에서 깊이 다룹니다.
전부 체크되면 Step 2 완료입니다. 사이드바의 체크박스를 눌러 진도를 저장하세요.