터미널이라는 마법의 창문
검은 화면에 글자만 깜빡이는 그 창. 왜 "터미널"이라고 부를까요? 어디서 온 이름이고, 우리는 거기에 뭘 입력하는 걸까요? 처음 만지는 사람의 눈높이에서 출발합니다.
"터미널"이라는 단어, 어디서 왔을까
한국말로 옮기면 "터미널 = 끝, 종착점"입니다. 영어 단어 terminal의 원래 뜻이 그래요. 공항의 "터미널 빌딩", 버스 터미널 할 때 그 단어와 정확히 같은 단어입니다.
그런데 왜 검은 화면이 "끝"이라고 불릴까요? 1960~70년대 컴퓨터 역사 이야기입니다.
지금은 그런 거대 컴퓨터를 쓸 일이 거의 없습니다. 노트북 한 대가 옛날 메인프레임보다 훨씬 강력하니까요. 그런데도 "터미널"이라는 이름은 그대로 남았습니다.
terminal emulator(터미널 에뮬레이터). 그래서 우분투에서 켜는 GNOME Terminal, 맥에서 켜는 Terminal.app, Windows의 Windows Terminal 모두 정식 명칭에 "터미널"이 들어가 있어요. 다 같은 가족입니다.
정리하면 이렇습니다:
- 옛날: 컴퓨터 본체에 케이블로 연결된 키보드+화면 장치 = 터미널
- 지금: 그 옛날 화면을 흉내내며 명령어를 받는 프로그램 = (가상)터미널
- 이유: 화려한 GUI가 생기기 전엔, 컴퓨터를 부리는 거의 유일한 방법이었음
일단 터미널을 열어봅시다 (Ctrl+Alt+T)
이론은 충분합니다. 직접 켜봐야 합니다. 리눅스에선 보통 이렇게 엽니다:
대부분의 리눅스 배포판(우분투, 민트, 데비안 계열)에서
Ctrl + Alt + T를 누르면 터미널이 바로 열립니다. 이걸 외우세요. 앞으로 수천 번 누를 단축키입니다.
단축키가 안 먹는 경우엔:
- 메뉴에서 찾기 — 화면 좌측 또는 좌하단 메뉴 버튼 → "터미널" 검색
- 바탕화면 우클릭 — XFCE 같은 환경에선 우클릭 메뉴에 "터미널 열기" 항목 존재
- 파일 관리자에서 — 폴더 안에서 우클릭 → "현재 위치에서 터미널 열기"
설정 → 키보드 → 단축키에서 "터미널 실행"에 Ctrl+Alt+T를 직접 지정할 수 있어요.
열면 검은(또는 어두운) 창이 하나 뜨고, 안에 글자가 한 줄 깜빡이고 있을 겁니다. 다음 레슨에서 그 한 줄을 해부해봅시다.
처음 보이는 그 한 줄 — "프롬프트"
터미널을 처음 열면 이런 줄이 보일 거예요:
cdct@mylinux:~$ ▮
이 한 줄을 프롬프트(prompt)라고 부릅니다. 영어 prompt는 "재촉하다, 부추기다, ~하라고 알리다"는 뜻이에요. 즉 "이제 명령어를 치라고 알려주는 신호"입니다. 깜빡이는 커서까지 같이 있죠.
각 부분을 잘라서 보면:
| 부분 | 의미 | 예시 |
|---|---|---|
cdct | 지금 로그인한 사용자 이름 | ubuntu, root, john ... |
@ | "~의" 라는 구분자. 영어로 'at' | 이메일의 @와 같은 의미 |
mylinux | 이 컴퓨터의 이름(호스트네임) | desktop, server01 ... |
: | 사용자/호스트와 경로를 가르는 콜론 | — |
~ | 현재 위치한 디렉토리. 틸드(~)는 "내 홈"을 의미 | /home/cdct, /etc, /tmp ... |
$ | 일반 사용자 프롬프트. "명령 받을 준비됨"의 신호 | 관리자(root)면 # |
읽으면 이렇게 됩니다: "cdct라는 사용자가, mylinux라는 컴퓨터에서, 내 홈 디렉토리에서, 명령을 받을 준비가 됨".
$는 일반 사용자, #은 시스템 전체를 만질 수 있는 관리자(root). 인터넷에서 "이 명령어 쳐보세요"라는 글을 볼 때, 줄 맨 앞에 $ 또는 #이 보인다면 그건 예시 표시일 뿐 실제로 같이 입력하는 글자가 아닙니다. 그 뒤만 복사해서 붙여 넣으세요.
앞으로 이 책에서도 명령어 예시는 $로 시작하는 줄로 보여드릴 거예요. 그건 "이 줄을 치세요"라는 표시입니다. $는 빼고 그 뒤 부분만 입력하시면 됩니다.
$ 와 # 의 차이는?셸(shell) — 명령을 알아듣는 통역사
여기서 헷갈리는 단어가 셋 등장합니다. 차근차근 풀어드릴게요.
비유로 풀자면 — 손님(사용자)이 식당 카운터(터미널)에 와서 주문지를 내밀면, 점원(셸)이 그걸 주방(커널)에 전달해서 음식이 만들어집니다.
리눅스에서 가장 흔한 셸은 bash입니다. 풀어쓰면 Bourne Again SHell. 이름이 좀 웃기죠? 1979년에 Stephen Bourne이라는 사람이 만든 원조 셸 "Bourne shell"이 있었고, 그걸 다시 만들었다고 해서 "born again"(부활) 말장난으로 Bourne Again이 됐습니다.
| 셸 종류 | 특징 | 흔히 어디서 |
|---|---|---|
bash | 가장 표준, 가장 흔함 | Ubuntu, CentOS 등 대부분 |
zsh | bash 호환 + 자동완성/꾸미기 강함 | macOS 기본 (2019부터) |
fish | 친절한 자동완성, 문법 살짝 다름 | 입문자가 좋아함 |
sh | 가장 원시적, 표준 셸 스크립트용 | 스크립트 호환성 위해 |
$ echo $SHELL # 내가 지금 쓰는 셸 /bin/bash $ echo $0 # 현재 실행 중인 셸 이름 bash
이 두 명령은 아직 모르셔도 됩니다. "셸이 누구인지 물어보는 주문" 정도로 알고 넘어가세요. 다음 챕터에서 본격적으로 명령어를 배웁니다.
내 위치를 알자 — pwd & ls
터미널 안에서 길을 잃지 않으려면, 먼저 "지금 어디에 있는지", "여기에 뭐가 있는지" 알아야 합니다. 그게 첫 두 명령어 pwd와 ls입니다.
pwd — 나 지금 어디 있어?
드디어 첫 명령어입니다. 세 글자: pwd. 풀어 쓰면:
한국어로 옮기면 "지금 작업 중인 디렉토리를 화면에 출력해라". 그게 전부입니다.
$ pwd /home/cdct
이 결과 /home/cdct는 무엇을 의미할까요? 슬래시(/)를 기준으로 한 칸씩 들어간다고 보면 됩니다.
/— 모든 것의 시작, 최상위 (이걸 "루트"라고 부릅니다)/home— 사용자들이 사는 동네/home/cdct— 그 동네 안 "cdct"라는 사람의 집
/home/cdct 같은 위치를 말해요. 컴퓨터를 처음 켜고 터미널을 열면 거의 항상 이 위치에서 시작합니다. 사용자가 자기 파일을 두는 자기 영역이라서요. 줄여서 ~(틸드 기호)라고도 표현합니다. 챕터 3에서 자세히 다룹니다.
왜 굳이 첫 명령이 "내 위치 확인"일까요? — 터미널엔 윈도우 탐색기처럼 위치를 보여주는 주소창이 없기 때문입니다. 프롬프트에 짧게 표시되긴 하지만(~ 같은 식으로), 정확한 전체 경로를 보려면 pwd를 직접 쳐야 합니다.
pwd가 무엇의 약자인가요?"디렉토리"와 "폴더" — 같은 거야, 다른 거야?
여기서 한 번 짚고 가야 할 단어가 있습니다. 디렉토리(directory)와 폴더(folder).
그런데 어쩌다 이름이 두 개가 됐냐, 그게 재미있는 이야기입니다.
| 이름 | 등장 시기 | 유래 |
|---|---|---|
directory | 1970년대 유닉스 | 영어로 "전화번호부, 명단, 목록" — 파일 목록을 담는 곳이라는 의미 |
folder | 1980년대 GUI 시대 | 영어로 "서류철" — 그래픽 화면에 종이 폴더 모양 아이콘을 보여주면서 |
맥OS와 윈도우즈 같은 그래픽 운영체제가 등장하면서, 일반 사용자에게 "디렉토리"는 너무 기술적인 단어로 느껴졌습니다. 그래서 책상 위의 서류철처럼 친숙한 단어인 "폴더"로 부르기 시작한 거예요. 노란색 폴더 아이콘 기억나시죠?
/dev/ 아래에 파일로 존재합니다. 처음엔 어색하지만 익숙해지면 강력한 개념입니다.
ls — 여기 뭐가 있어?
위치는 알았으니, 그 위치에 뭐가 있는지 봅시다. 두 글자: ls. 풀어 쓰면 LiSt — "목록을 보여줘".
$ ls Desktop Documents Downloads Music Pictures Videos
홈 디렉토리에서 ls를 치면 보통 이런 폴더들이 나옵니다. 운영체제가 사용자에게 기본 제공하는 폴더들이에요.
- 파란색 — 디렉토리(폴더)
- 흰색/회색 — 일반 파일
- 초록색 — 실행 가능한 파일
- 하늘색 — 심볼릭 링크(바로가기)
- 빨간색 — 압축 파일
특정 위치를 보고 싶으면 뒤에 경로를 붙입니다.
$ ls /etc # 시스템 설정 폴더 안에 뭐 있나? apache2 bash.bashrc cron.d hostname hosts passwd ... $ ls Documents # 내 Documents 안에 뭐 있나? memo.txt report.pdf $ ls / # 루트(최상위)엔 뭐 있나? bin boot dev etc home lib media opt proc root sbin ...
ls /etc의 경우 ls가 명령어, /etc가 대상(어디를 볼지). 명령어 다음에 공백을 두고 정보를 추가로 주는 방식입니다. 거의 모든 리눅스 명령어가 이 패턴이에요.
ls 명령어는 무엇을 출력합니까?ls의 옵션들 — -l, -a, -lh
그냥 ls는 시작일 뿐입니다. 진짜 자주 쓰는 건 ls 뒤에 옵션을 붙인 형태예요.
-(하이픈 하나) + 알파벳 한 글자, 긴 옵션은 --(하이픈 두 개) + 단어로 표기합니다. 예:
ls -l (짧은 옵션) = ls --format=long (긴 옵션) — 같은 동작.
-l : long format (자세히)
$ ls -l drwxr-xr-x 2 cdct cdct 4096 Apr 12 10:33 Desktop drwxr-xr-x 5 cdct cdct 4096 May 03 18:21 Documents -rw-r--r-- 1 cdct cdct 142 May 11 09:00 memo.txt
한 줄이 길어 보이지만, 왼쪽부터 7개 칸으로 끊어 읽으면 어렵지 않아요:
| 위치 | 예시 | 의미 |
|---|---|---|
| 1 | drwxr-xr-x | 권한 정보. 맨 앞 d는 디렉토리, -면 일반 파일 |
| 2 | 2 | 이 항목을 가리키는 링크 수 (지금은 신경 X) |
| 3 | cdct | 파일 주인 (사용자) |
| 4 | cdct | 파일이 속한 그룹 |
| 5 | 4096 | 크기 (바이트 단위) |
| 6 | Apr 12 10:33 | 마지막 수정 시각 |
| 7 | Desktop | 파일/폴더 이름 |
-a : all (숨김 파일 포함)
리눅스에서는 이름이 점(.)으로 시작하는 파일/폴더는 자동으로 숨겨집니다. 평소 안 보여요. 그걸 보고 싶을 때 -a를 씁니다.
$ ls -a . .. .bashrc .config .profile Desktop Documents Downloads ...
이름이 .이나 ..인 것도 보이실 거예요. 이건 챕터 3에서 자세히 다룹니다. .bashrc나 .config 같은 건 평소엔 보이지 않는 설정 파일들입니다.
-l + -a 합치기 → -la
거의 모든 짧은 옵션은 합칠 수 있습니다. -l -a는 그냥 -la로 줄여 쓸 수 있어요.
$ ls -la # 숨김 포함 + 자세히 $ ls -lh # 자세히 + 사람이 읽기 좋은 크기(K/M/G) $ ls -lah # 세 가지 다 합치기 $ ls -lt # 시간순(최신 먼저)으로 자세히 $ ls -lS # 크기순(큰 것 먼저)으로 자세히
ls -lah입니다. 자세히 보면서, 숨김 파일까지, 크기는 사람이 읽기 좋게(1024 대신 1K). 외울 가치가 있어요. 손가락이 자동으로 치게 될 겁니다.
자리를 옮겨보자 — cd
위치를 알고, 거기 뭐가 있는지도 봤다면, 이제 그 안으로 들어가거나 다른 곳으로 옮겨갈 차례입니다. 그 명령이 cd입니다.
cd — Change Directory
두 글자, cd. 풀어 쓰면:
"디렉토리를 바꿔라" — 즉 "다른 곳으로 옮겨가라". 사용법은 단순합니다.
$ pwd # 출발 위치 확인 /home/cdct $ cd Documents # Documents로 이동 $ pwd # 도착 위치 확인 /home/cdct/Documents
패턴은 항상 똑같습니다: cd [공백] [어디로]. 그게 전부예요.
cd Doc까지만 치고 Tab을 누르면 자동으로 cd Documents/로 완성됩니다. 오타도 안 나고 빠르고, 손목도 덜 아파요. 후보가 여러 개면 두 번 누르면 후보 목록이 보입니다. 평생 쓰는 단축키이니 지금부터 손에 익히세요.
cd documents와 cd Documents는 다른 명령입니다. 윈도우는 둘 다 같다고 보지만, 리눅스는 아닙니다. "그런 폴더 없다(No such file or directory)" 에러가 뜨면 대소문자부터 확인하세요.
cd는 무엇의 약자인가요?경로 — 절대경로 vs 상대경로
"어디로 갈지" 적는 방법이 두 가지 있습니다. 처음 보면 헷갈리지만, 비유 하나로 풀립니다.
$ cd /home/cdct/Documents # 출발 위치 무관 — 어디서 쳐도 같은 곳에 도착
$ cd Documents # 지금 위치 기준으로 찾아감 # /home/cdct에 있을 때만 통함
절대경로는 "서울시 강남구 테헤란로 123" 같은 정식 주소예요. 어디서 출발하든 그 자체로 위치가 정해져 있어요. 항상
/로 시작합니다.상대경로는 "여기서 왼쪽으로 두 블록, 첫 번째 골목" 같은 안내예요. "여기"가 바뀌면 도착지도 바뀝니다.
/로 시작하지 않습니다.
# 내가 /home/cdct 에 있다고 가정 $ pwd /home/cdct # 방법 1 — 절대경로 (어디서 쳐도 정확히 같은 곳) $ cd /home/cdct/Documents # 방법 2 — 상대경로 (지금 /home/cdct에 있어야 통함) $ cd Documents
어느 쪽이 좋다 나쁘다는 없습니다. 상황에 따라 둘 다 씁니다.
- 가까운 곳으로 갈 땐 상대경로가 빠르고 짧음
- 먼 곳으로 가거나 어디서 칠지 모를 땐 절대경로가 안전함
- 스크립트나 설정 파일에 적을 땐 거의 항상 절대경로 (어디서 실행될지 모르니까)
특수 기호 — . , .. , ~ , /
리눅스 경로에는 자주 쓰는 약속된 기호가 네 개 있습니다. 외워두면 인생이 편해져요.
| 기호 | 의미 | 예시 |
|---|---|---|
. | 지금 위치(현재 디렉토리) | ./script.sh (지금 위치의 script.sh) |
.. | 한 단계 위(부모 디렉토리) | cd .. |
~ | 내 홈 디렉토리 (예: /home/cdct) | cd ~/Downloads |
/ | 루트(최상위) | cd / 또는 /etc/... |
점 하나 vs 점 두 개
이게 처음엔 가장 헷갈립니다. 비교해서 봅시다.
# 지금 /home/cdct/projects 에 있다면 $ cd . # 그대로 /home/cdct/projects # (이동이 없는 셈)
# 지금 /home/cdct/projects 에 있다면 $ cd .. # /home/cdct 로 한 칸 위로 올라감
./run.sh는 "지금 위치의 run.sh를 실행해"라는 명시적 표현. 그냥 run.sh라고 치면 시스템이 다른 곳에서 찾아버려서 못 찾을 수 있거든요.
틸드(~) — 내 홈
키보드 좌상단 ~ 기호 (Shift + 1 옆 키). 이건 "현재 사용자의 홈 디렉토리"를 의미하는 약속 기호입니다.
$ cd ~ # 홈으로 (그냥 cd만 쳐도 됨) $ cd ~/Downloads # /home/cdct/Downloads $ ls ~/.config # 홈의 .config 폴더 내용 보기
cd 단독 / cd -
두 가지 편의 기능이 더 있습니다.
$ cd # 인자 없이 cd만 → 홈으로 (cd ~ 와 동일) $ cd /var/log $ cd /etc $ cd - # 직전 위치로 토글 (/var/log로 돌아감) /var/log $ cd - # 또 토글 (/etc로 돌아감) /etc
cd -는 두 위치 사이를 왔다 갔다 할 때 진짜 편합니다. 탭(브라우저 탭 전환)처럼 토글로 생각하면 됩니다.
/home/cdct/projects/myapp에 있을 때 cd ..를 치면 어디로 갈까요?실습 — 이리저리 옮겨다니기
이론은 충분합니다. 실제로 따라 쳐보세요. 각 줄을 직접 입력하고 결과를 확인하는 게 중요합니다.
# 1) 일단 홈으로 가서 위치 확인 $ cd ~ $ pwd /home/cdct # 2) Documents로 들어가기 $ cd Documents $ pwd /home/cdct/Documents # 3) 한 단계 위로 $ cd .. $ pwd /home/cdct # 4) 또 한 단계 위로 $ cd .. $ pwd /home # 5) 또 한 번 → 루트 도착 $ cd .. $ pwd / # 6) 루트에서 뭐가 있나 보기 $ ls bin boot dev etc home lib media opt proc root run sbin ... # 7) 절대경로로 한 번에 점프 $ cd /home/cdct/Documents $ pwd /home/cdct/Documents # 8) 토글로 돌아가기 $ cd /etc $ cd - /home/cdct/Documents # 9) 인자 없이 cd → 홈으로 귀가 $ cd $ pwd /home/cdct
/를 맨 위에 두고 트리처럼 가지를 그리면서 "지금 어디에 있는지" 손으로 따라가는 게 머리에 박힙니다. cd는 그 트리 위의 점프입니다.
만들고 지우기 — touch · mkdir · rm
여기서부터 진짜 "만지는" 영역입니다. 파일을 만들고, 폴더를 만들고, 만든 것을 지워보면서 손에 익혀봅시다. 마지막엔 위험한 명령도 다루니 끝까지 읽어주세요.
touch — 빈 파일 만들기
이름이 좀 이상한 명령어입니다. touch는 영어로 "건드리다, 만지다"라는 뜻이에요. 그게 본래 용도였습니다.
$ cd ~ $ touch hello.txt # 빈 파일 생성 $ ls Desktop Documents Downloads hello.txt Music Pictures Videos $ touch a.txt b.txt c.txt # 여러 개 한번에도 가능 $ ls a.txt b.txt c.txt Desktop Documents Downloads hello.txt ...
여러 파일을 한 번에 만들 수 있는 게 보이시죠? 명령어 뒤에 공백으로 구분해 여러 개를 적으면 차례로 처리합니다. 리눅스의 거의 모든 명령이 이래요.
mkdir — Make Directory
이번엔 폴더(디렉토리) 만들기. mkdir 다섯 글자.
"디렉토리를 만들어라". 사용법은 touch와 비슷합니다.
$ cd ~ $ mkdir test # test 폴더 만들기 $ ls Desktop Documents Downloads test ... $ cd test # 만든 폴더 안으로 들어가기 $ pwd /home/cdct/test $ ls # 안엔 아무것도 없음 (새로 만들었으니까) $ mkdir inside # 그 안에 또 만들기 $ ls inside $ cd .. # 한 칸 위로 나가기 $ pwd /home/cdct
mkdir test를 또 치면, "이미 존재한다(File exists)"는 에러가 납니다. 안전장치예요. 기존 폴더는 그대로 보존됩니다.
여러 폴더를 한 번에 만들 수도 있어요.
$ mkdir apple banana cherry $ ls apple banana cherry ...
mkdir -p — 깊은 폴더를 한 방에
가끔 이런 게 필요합니다: "projects/myapp/src/utils 같은 깊은 폴더 구조를 한 번에 만들고 싶다". 그냥 mkdir로는 안 됩니다.
$ mkdir projects/myapp/src/utils mkdir: cannot create directory 'projects/myapp/src/utils': No such file or directory
왜 에러? "projects도 없는데 그 안에 myapp을 어떻게 만드냐"는 항의입니다. 이럴 땐 -p 옵션:
$ mkdir -p projects/myapp/src/utils $ ls projects myapp $ ls projects/myapp src $ ls projects/myapp/src utils
parents의 약자입니다. "필요하면 부모 디렉토리들도 같이 만들어줘"라는 뜻이에요. 옵션 글자 하나에도 다 이유가 있습니다. 외울 필요는 없지만, 알면 안 까먹어요.
-p는 또 하나 좋은 점이 있어요: 이미 폴더가 있어도 에러를 내지 않습니다. 스크립트에서 "있으면 그대로, 없으면 만들기"가 필요할 때 자주 씁니다.
mkdir -p a/b/c 명령의 동작은?rmdir — 빈 폴더 지우기
만들었으면 지우는 것도 알아야죠. 폴더 지우기는 rmdir입니다.
$ cd ~ $ mkdir tobedeleted # 일단 만들고 $ ls ... tobedeleted ... $ rmdir tobedeleted # 지우기 $ ls # 사라짐 확인 ... (tobedeleted 없음) ...
rm -r을 써야 합니다.
$ mkdir hasstuff $ touch hasstuff/inside.txt $ rmdir hasstuff rmdir: failed to remove 'hasstuff': Directory not empty
rm — 파일 지우기
이번엔 파일 지우기. rm 두 글자. ReMove의 줄임입니다.
$ touch trash.txt $ ls ... trash.txt ... $ rm trash.txt # 지우기 $ ls ... (trash.txt 없음) ...
rm으로 지운 파일은 즉시 영구 삭제입니다. Ctrl+Z로 되돌릴 수도, 휴지통에서 복구할 수도 없어요. 칠 때마다 한 번 더 확인하는 습관을 들이세요.(파일 관리자에서 마우스로 지우는 건 보통 휴지통으로 들어갑니다 — 그건 다른 동작입니다.
rm은 그렇지 않습니다.)
실수가 무서우면 -i (interactive, 확인) 옵션을 붙이세요. 하나하나 물어봅니다.
$ rm -i a.txt b.txt c.txt rm: remove regular empty file 'a.txt'? y rm: remove regular empty file 'b.txt'? n rm: remove regular empty file 'c.txt'? y # y는 지움, n은 건너뜀
rm -r / rm -rf — 폴더 통째로 지우기
가득 찬 폴더를 지우려면 rmdir로는 안 됩니다 (앞 레슨 참고). 이럴 땐 rm에 옵션을 붙입니다.
| 옵션 | 풀이 | 의미 |
|---|---|---|
-r | Recursive | 안에 든 모든 것을 재귀적으로 같이 지움 |
-f | Force | 묻지 않고 강제로 지움 (확인 메시지 무시) |
-rf | 합치기 | 위 둘 다 — 묻지도 따지지도 않고 폴더 통째로 |
# 실습용 폴더 만들기 $ mkdir -p playground/sub/deeper $ touch playground/file1.txt playground/sub/file2.txt $ ls -R playground # -R 옵션은 ls도 재귀적으로 playground: file1.txt sub playground/sub: deeper file2.txt playground/sub/deeper: # 통째로 지우기 $ rm -r playground $ ls playground ls: cannot access 'playground': No such file or directory # 사라졌습니다!
rm -rf / — 시스템 전체를 통째로 날립니다. 운영체제가 죽을 수 있어요.rm -rf ~ — 내 홈 디렉토리의 모든 파일이 즉시 사라집니다.sudo rm -rf /* — 관리자 권한으로 위와 비슷한 짓.인터넷의 장난으로 이런 명령을 권하는 글이 있을 수 있어요. 절대 따라 하지 마세요. 모르는 명령은 일단
--help로 확인하는 습관을 들이세요(챕터 5).
rm -rf치기 전에ls로 그 경로에 뭐가 있는지 먼저 확인- 경로를 두 번 확인. 특히
/하나가 어디에 있는지 (앞에 있나 뒤에 있나) - 중요한 작업은
-i(interactive)로 하나하나 확인하며 지우기
myproject를 지우려면?파일 다루기 & 도움말 보기
파일 내용을 들여다보고, 복사하고, 옮기고. 그리고 모르는 명령은 어떻게 스스로 찾아보는지까지. 여기까지 마스터하면 진짜 기초는 끝입니다.
cat — 파일 들여다보기
cat은 세 글자. 그런데 어원이 재미있습니다. 풀어 쓰면:
영어로 "이어붙이다, 연결하다"라는 단어 concatenate의 줄임이에요. 원래 용도는 파일 여러 개를 이어붙여서 출력하는 것이었습니다. 그런데 파일 하나만 줘도 그 내용을 출력해주니까, 결국 "파일 내용 보기"의 표준 명령이 됐습니다.
# 실습용 파일 만들기 (echo로 글자 써넣기) $ echo "안녕 리눅스" > hello.txt $ cat hello.txt 안녕 리눅스 # 시스템 파일 들여다보기 — 시스템에 어떤 사용자가 있나 $ cat /etc/passwd root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin ... # 여러 파일을 이어붙여 출력 (cat의 원래 용도) $ echo "파일1" > a.txt $ echo "파일2" > b.txt $ cat a.txt b.txt 파일1 파일2
less 같은 페이지 단위 도구가 더 좋아요(잠시 후 man에서 다룹니다). 짧은 파일 빠르게 볼 때 cat이 편합니다.
cp — Copy (복사)
파일/폴더를 복사할 땐 cp. 두 글자, 그냥 copy의 줄임입니다.
패턴: cp [원본] [사본]. 원본은 그대로 두고, 사본을 만듭니다.
$ echo "원본" > original.txt $ cp original.txt copy.txt $ ls copy.txt original.txt $ cat copy.txt 원본 # 같은 내용으로 복사됨 # 다른 폴더로 복사하면 이름은 그대로 $ mkdir backup $ cp original.txt backup/ $ ls backup original.txt
폴더를 통째로 복사할 땐 — 기억나시죠? rm처럼 -r이 필요합니다.
$ cp backup # 폴더만 주면? 안 됨! cp: -r not specified; omitting directory 'backup' $ cp -r backup backup2 # -r로 폴더 통째 복사 $ ls backup backup2 copy.txt original.txt
-r(recursive, 재귀적)이 필요해요. rm -r, cp -r, ls -R(대문자) 등. 외워두면 다음에 만날 명령도 쉽게 따라 갑니다.
mv — Move (이동 + 이름변경)
mv 두 글자. move의 줄임이에요. 두 가지 일을 합니다:
- 파일을 다른 위치로 이동
- 파일의 이름을 변경
처음엔 좀 이상하게 보입니다. "왜 이동이랑 이름변경이 같은 명령이야?". 비밀은 이렇습니다 — 리눅스에선 "이름 바꾸기"가 사실 "같은 위치로 옮기는데 이름만 다르게"입니다. 한 명령으로 둘 다 처리해버립니다.
# 1) 이름 변경 (같은 위치, 새 이름) $ touch old_name.txt $ mv old_name.txt new_name.txt $ ls new_name.txt # old_name.txt는 사라지고 new_name.txt만 남음 # 2) 이동 (다른 폴더로) $ mkdir archive $ mv new_name.txt archive/ $ ls archive $ ls archive new_name.txt # 3) 이동 + 이름변경을 한 번에 $ mv archive/new_name.txt ~/Documents/final.txt # Documents 안으로 옮기면서 이름도 final.txt로 변경
ren, 다른 일부 시스템엔 rename 같은 별도 명령이 있습니다. 리눅스에는 그런 게 따로 없어요. 왜? mv 하나면 충분하니까요. "기능이 적은 게 아니라, 적은 명령에 많은 기능을 담은 것"이 유닉스 철학입니다.
mv는 경고 없이 덮어씁니다. 원본 파일이 사라질 수 있어요. 안전하게 하려면 mv -i(묻기) 또는 mv -n(이미 있으면 건너뜀)을 쓰세요.
--help — 가장 가까운 도움말
지금까지 8개 명령(pwd, ls, cd, touch, mkdir, rmdir, rm, cp, mv, cat)을 배웠습니다. 옵션도 몇 개 나왔어요. 그런데 옵션이 그 외에도 많거든요. 다 외울 수 없죠.
그럴 때 가장 빠른 도움말: 명령어 뒤에 --help를 붙이는 것.
$ ls --help Usage: ls [OPTION]... [FILE]... List information about the FILEs (the current directory by default). ... -a, --all do not ignore entries starting with . -A, --almost-all do not list implied . and .. -h, --human-readable with -l and -s, print sizes like 1K 234M 2G -l use a long listing format -R, --recursive list subdirectories recursively -S sort by file size, largest first -t sort by modification time, newest first ...
옵션 목록과 한 줄 설명이 쭉 나옵니다. 모르는 옵션이 있으면 이 목록에서 검색하면 돼요.
--help는 거의 모든 GNU/리눅스 표준 명령이 지원합니다. "이 명령 옵션 뭐 있더라?" 싶으면 일단 --help부터. 인터넷 검색보다 빠릅니다.
man — Manual Page (정식 매뉴얼)
--help는 빠른 참조용 짧은 도움말입니다. 진짜 자세한 설명서는 man 페이지예요.
사용법: man [공백] [명령어 이름].
$ man ls LS(1) User Commands LS(1) NAME ls - list directory contents SYNOPSIS ls [OPTION]... [FILE]... DESCRIPTION List information about the FILEs (the current directory by default). ... Mandatory arguments to long options are mandatory for short options too. -a, --all do not ignore entries starting with . ...
전체 화면을 매뉴얼이 차지합니다. 처음엔 "어, 빠져나가는 법을 모르겠어"가 됩니다. 안심하세요, 키 하나로 빠져나옵니다.
| 키 | 동작 |
|---|---|
↑ ↓ 또는 j k | 한 줄씩 위/아래로 |
Space 또는 f | 한 페이지 아래로 |
b | 한 페이지 위로 |
/검색어 + Enter | 해당 단어 검색 |
n / N | 검색 결과 다음/이전 |
g / G | 맨 처음/맨 끝으로 |
q | 나가기 (가장 중요!) |
q 한 글자입니다. q = quit. man뿐 아니라 less, more, vi/vim의 명령 모드 등 많은 도구에서 통합니다. 외워두세요.
man 페이지는 보통 이런 구조입니다:
- NAME — 명령 한 줄 요약
- SYNOPSIS — 사용 패턴 (
[]는 선택,...은 반복 가능) - DESCRIPTION — 상세 설명
- OPTIONS — 옵션 목록
- EXAMPLES — 사용 예 (없는 경우도 많음)
- SEE ALSO — 관련 명령
man ls로 매뉴얼을 보다가 빠져나가려면 어떤 키를 누르나요?여기까지 마치며 — 다음 권으로 가는 길
축하합니다. 진짜 기초의 기초를 다 봤어요. 정리하면 손에 익힌 명령이 이만큼입니다:
| 분류 | 명령 | 한 줄 요약 |
|---|---|---|
| 위치 | pwd | 지금 어디 있는지 |
cd | 다른 디렉토리로 이동 | |
| 목록 | ls / ls -lah | 여기 뭐 있는지 / 자세히+숨김+가독성 |
| 만들기 | touch | 빈 파일 만들기 |
mkdir / mkdir -p | 폴더 만들기 / 깊은 폴더 한 번에 | |
echo "글" > 파일 | 글자 적힌 파일 만들기 (보너스) | |
| 지우기 | rmdir | 빈 폴더 지우기 |
rm | 파일 지우기 (복구 불가!) | |
rm -r | 폴더 통째로 지우기 (위험) | |
| 다루기 | cat | 파일 내용 보기 |
cp / cp -r | 복사 / 폴더 복사 | |
mv | 이동 + 이름변경 | |
| 도움말 | --help | 빠른 옵션 목록 |
man | 자세한 매뉴얼 (q로 나가기) |
/linuxlab/)으로 가세요. 권한(chmod), 패키지(apt), 편집기(nano, vim), 환경변수(.bashrc), 셸 스크립트, grep/sed/awk, SSH 원격 접속, Python 입문, C언어까지 다룹니다. 이 책의 다음 챕터라고 봐도 됩니다.
다음 권에서 만나기 전까지 한 가지만 부탁드립니다 — 매일 5분이라도 터미널을 열어보세요. 폴더 만들고, 들어가고, 파일 옮기고, 지우는 동작을 반복하면 일주일 안에 손이 기억합니다. 명령어 외우는 것보다 그 감각이 훨씬 중요합니다.