Step 2. 파일 다루기 — 만들고, 복사하고, 옮기고, 지우기

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가 아니니 파일입니다. 그리고 Length0 — 내용이 없는 빈 파일이라는 뜻입니다.

이제 내용을 넣어 봅시다:

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.txta.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 폴더 안에서, 오늘 배운 것만으로 다음을 수행하세요:

  1. project라는 폴더를 만들고 들어가세요.
  2. 그 안에 plan.txt, memo.txt, data.csv, run.log 네 파일을 만드세요.
  3. plan.txt에 "이것은 계획서다"라고 내용을 쓰고, 읽어서 확인하세요.
  4. archive 폴더를 만들고, .txt 파일만 그곳에 복사하세요. (plan.txt 원본은 남아 있어야 합니다.)
  5. run.logarchive 폴더로 이동하세요. (원본 위치에는 없어야 합니다.)
  6. data.csv-WhatIf로 삭제 시뮬레이션한 뒤, 진짜로 삭제하세요.
  7. 마지막에 lsls archive 결과가 이렇게 되는지 확인하세요:
    • 현재 폴더: plan.txt, memo.txt, archive
    • archive 안: plan.txt, memo.txt, run.log

연습문제

문제 1. Copy-ItemMove-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으로 지웠다!"

예방이 유일한 답입니다. 복구 방법이 아주 없는 건 아니지만(복구 도구, 백업), 성공률이 낮습니다. 그래서 오늘부터의 철칙:

  1. 지우기 전 ls로 대상 확인
  2. 와일드카드로 지울 땐 반드시 -WhatIf 먼저
  3. 중요한 건 지우지 말고 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 완료입니다. 사이드바의 체크박스를 눌러 진도를 저장하세요.