DaleSchool

파일과 디렉토리 조작

입문25분

학습 목표

  • mkdir, touch로 디렉토리와 파일을 만들 수 있다
  • cp, mv로 파일을 복사하고 이동할 수 있다
  • rm 명령어를 안전하게 사용할 수 있다
  • 와일드카드(*)로 여러 파일을 한번에 처리할 수 있다

동작하는 코드

예제 1: 디렉토리와 파일 만들기

mkdir practice
cd practice
touch hello.txt
touch world.txt
ls

출력:

hello.txt  world.txt

mkdir은 디렉토리를 만들고, touch는 빈 파일을 만듭니다.

예제 2: 파일 복사와 이름 변경

# 파일 복사
cp hello.txt hello-backup.txt
ls

출력:

hello-backup.txt  hello.txt  world.txt
# 파일 이름 변경 (mv는 이동과 이름 변경 모두 처리)
mv world.txt universe.txt
ls

출력:

hello-backup.txt  hello.txt  universe.txt

예제 3: 디렉토리로 파일 이동

mkdir docs
mv hello.txt docs/
mv universe.txt docs/
ls
ls docs/

출력:

docs  hello-backup.txt

hello.txt  universe.txt

직접 수정하기

중첩 디렉토리 한번에 만들기

# -p 옵션: 중간 경로도 함께 생성
mkdir -p projects/my-app/src
ls projects/
ls projects/my-app/

출력:

my-app

src

mkdir -p는 경로의 모든 단계를 한번에 만들어줍니다. 중간 디렉토리가 이미 있어도 오류가 나지 않습니다.

디렉토리 전체 복사

mkdir -p backup
cp -r docs/ backup/docs
ls backup/

디렉토리를 복사할 때는 -r(recursive) 옵션이 반드시 필요합니다.

파일 삭제

rm hello-backup.txt
ls
# 디렉토리 삭제
rm -r backup/
ls

"왜?" — 각 명령어의 역할

| 명령어 | 뜻 | 주요 옵션 | | ------- | --------------------------- | -------------------------------------- | | mkdir | Make Directory | -p: 중간 경로 함께 생성 | | touch | 파일 생성 / 타임스탬프 갱신 | — | | cp | Copy | -r: 디렉토리, -i: 덮어쓰기 전 확인 | | mv | Move (이름 변경도 동일) | -i: 덮어쓰기 전 확인 | | rm | Remove | -r: 디렉토리, -f: 강제 삭제 |

mv는 이동이자 이름 변경

# 이름 변경 (같은 디렉토리 내)
mv old-name.txt new-name.txt

# 다른 디렉토리로 이동
mv file.txt ~/Documents/

# 이동하면서 이름도 변경
mv file.txt ~/Documents/renamed.txt

cp 주요 패턴

# 파일 복사
cp source.txt destination.txt

# 디렉토리 복사
cp -r source-dir/ destination-dir/

# 여러 파일을 디렉토리로 복사
cp file1.txt file2.txt target-dir/

흔한 실수

실수 1: rm은 휴지통이 아님

rm은 파일을 즉시 영구 삭제합니다. 휴지통으로 가지 않습니다.

rm important.txt   # 복구 불가!

안전하게 쓰는 습관:

# 삭제 전 ls로 대상 확인
ls *.log

# -i 옵션으로 삭제 전 확인 받기
rm -i important.txt
# remove important.txt? y

실수 2: rm -rf의 위험성

# 절대 하지 마세요
rm -rf /
rm -rf ~/*
rm -rf .    # 현재 디렉토리 통째로 삭제

-f는 확인 없이 강제 삭제, -r은 재귀적으로 모두 삭제입니다. 조합하면 매우 위험합니다.

실수 3: cp 목적지 실수

# 이미 있는 파일에 복사하면 덮어씌워짐 (경고 없음)
cp new.txt existing-important.txt

# 안전하게: -i 옵션으로 덮어쓰기 전 확인
cp -i new.txt existing-important.txt
# overwrite existing-important.txt? (y/n [n])

실수 4: 디렉토리 복사할 때 -r 빠뜨리기

# 에러 발생
cp my-folder/ backup/
# cp: my-folder is a directory (not copied)

# 올바름
cp -r my-folder/ backup/

심화 학습

와일드카드(_)로 여러 파일 한번에

_는 어떤 문자열과도 매칭됩니다:

# .txt 파일 모두 나열
ls *.txt

# log로 시작하는 파일 모두 삭제
rm log*

# 모든 파일을 backup 디렉토리로 복사
cp *.txt backup/

# 특정 패턴만 매칭: ?는 문자 하나
ls file?.txt  # file1.txt, file2.txt는 매칭, file10.txt는 아님

와일드카드는 삭제할 때 특히 신중하게 사용하세요. rm *.txt 실행 전에 반드시 ls *.txt로 먼저 확인하세요.

심볼릭 링크 (ln -s)

심볼릭 링크는 파일/디렉토리의 별명(바로가기)입니다:

# 심볼릭 링크 만들기
ln -s ~/Documents/project/config.txt config

# 확인 (l이 앞에 붙음)
ls -la config
# lrwxr-xr-x  1 dale staff  35 Jan 15 config -> /Users/dale/Documents/project/config.txt

# 링크로 파일 접근
cat config   # 원본 config.txt 내용이 출력

실무에서 자주 쓰이는 경우:

  • 긴 경로를 짧게 만들 때
  • 여러 곳에서 같은 파일을 공유할 때
  • 버전별 파일을 관리할 때 (config → config-v2.txt)

:::details{title="macOS에서 안전하게 삭제하기 (trash)"] macOS에서 trash 명령어를 설치하면 휴지통으로 보낼 수 있습니다:

brew install trash
trash important.txt   # 휴지통으로 이동 (복구 가능)

중요한 파일은 rm 대신 trash를 쓰는 습관을 들이면 실수를 방지할 수 있습니다. :::

  1. mkdir -p workspace/project/src workspace/project/docs로 중첩 디렉토리를 한번에 만드세요.
  2. workspace/project/ 안에 README.md, src/main.py, docs/guide.txt를 만드세요.
  3. cp -r workspace/project workspace/project-backup으로 전체 백업을 만드세요.
  4. mv workspace/project/docs/guide.txt workspace/project/docs/user-guide.txt로 파일 이름을 변경하세요.
  5. ls -la workspace/project/docs/로 결과를 확인하세요.

Q1. 디렉토리를 포함한 모든 내용을 재귀적으로 복사하는 올바른 명령어는?

  • A) cp -a source/ dest/
  • B) cp -r source/ dest/
  • C) cp -f source/ dest/
  • D) cp -d source/ dest/