동작하는 코드
예제 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를 쓰는 습관을 들이면 실수를 방지할 수 있습니다.
:::
mkdir -p workspace/project/src workspace/project/docs로 중첩 디렉토리를 한번에 만드세요.workspace/project/안에README.md,src/main.py,docs/guide.txt를 만드세요.cp -r workspace/project workspace/project-backup으로 전체 백업을 만드세요.mv workspace/project/docs/guide.txt workspace/project/docs/user-guide.txt로 파일 이름을 변경하세요.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/