[개발 환경] 리눅스 CLI (Command Line Interface) 명령어
우리는 일반적으로 터미널에서 Bash shell을 이용해 리눅스 OS와 소통한다.
보통은 리눅스 환경에서 터미널에서 치는 모든 명령어를 묶어서 리눅스 명령어라고 부르기는 하지만, 엄밀히 말하면 Bash 명령어와 리눅스 명령어는 다르다.
Bash 명령어는 shell이라는 프로그램 자체가 원래부터 할 줄 아는 내장 명령어이다. 반면, 리눅스 명령어는 shell이 처리할 수 없는 복잡한 일들을 처리하기 위해 리눅스 OS 내부에 따로 설치해 둔 별도의 외부 프로그램들이다.
내가 지금 입력하는 명령어가 Bash 명령어인지, 리눅스 명령어인지 궁금하다면 터미널에 type {명령어}를 입력해서 확인할 수 있다.
1
2
3
4
5
user@server:~$ type cd
> cd is a shell builtin
user@server:~$ type cat
> cat is /usr/bin/cat
아래는 우리가 주로 리눅스 환경에서 사용하는 CLI 명령어들을 정리한 것이다.
디렉토리
| 명령어 | 설명 | 형식 | 사용 예시 |
|---|---|---|---|
ls | 현재 위치에 있는 파일과 폴더 목록 출력 (List) | ls | ls |
cd | 다른 폴더로 이동 (Change Directory) | cd <이동할 폴더> | cd project |
pwd | 현재 내가 있는 위치의 절대 경로 출력 (Print Working Directory) | pwd | pwd |
ls 명령어
ls -al을 사용하면 숨김 파일까지 확인할 수 있다.
cd 명령어
cd ..는 상위 폴더, cd ~는 홈 디렉토리로 이동한다.
파일 및 폴더 관리
| 명령어 | 설명 | 형식 | 사용 예시 |
|---|---|---|---|
mkdir | 새로운 폴더 생성 (Make Directory) | mkdir <새로 만들 폴더> | mkdir data |
rm | 파일이나 폴더 삭제 (Remove) | rm <삭제할 파일> rm -r <삭제할 폴더> | rm memo.txt rm -r data |
cp | 파일이나 폴더 복사 (Copy) | cp <복사할 파일> <새 파일> cp <복사할 파일> <도착 폴더> cp -r <복사할 폴더> <새 폴더> | cp report.txt report_backup.txt cp report.txt backup/ cp -r data data_backup |
mv | 파일이나 폴더 이동 또는 이름 변경 (Move) | mv <이동할 파일> <도착 폴더> mv <기존 이름> <새 이름> | mv report.txt backup/ mv old.txt new.txt |
cp 명령어
cp -r data data_backup을 실행했을 때 data_backup 디렉토리가 없다면, data 디렉토리의 복사본이 data_backup이라는 이름으로 새로 생성된다.
반대로cp -r data data_backup을 실행했을 때 data_backup 디렉토리가 이미 존재한다면, data 디렉토리가 그 안으로 복사되어 data_backup/data 형태가 된다.
mv 명령어
파일의 이름을 바꾸기 위해 mv <기존 이름> <새 이름>처럼 제자리에서 위치만 옮기는 방식으로도 사용할 수 있다.
파일 검색
리눅스의 파일 검색 명령어에서 grep은 파일 내용 안에서 특정 문자열을 찾을 때 사용하고, find는 특정 이름이나 조건을 가진 파일 또는 디렉토리를 찾을 때 사용한다.
| 명령어 | 설명 | 형식 | 사용 예시 |
|---|---|---|---|
grep | 텍스트 파일 안에서 특정 문자열이 포함된 줄을 검색 | grep <찾을 문자열> <파일명> | grep "ERROR" server.log |
find | 특정 경로 아래에서 파일이나 디렉토리를 검색 | find <검색할 경로> <조건> | find . -name "server.log" |
grep 명령어
grep은 텍스트 파일 안에서 특정 문자열이 포함된 줄을 찾아 출력하는 명령어이다.
1
grep "ERROR" server.log
위 명령어는 server.log 파일에서 ERROR라는 문자열이 포함된 줄만 출력한다.
기본적으로 grep은 대문자와 소문자를 구분한다.
대소문자를 구분하지 않고 검색하고 싶다면 -i 옵션을 사용하면 된다.
또한 | 기호를 사용하면 앞 명령어의 실행 결과를 다음 명령어의 입력으로 넘길 수 있는데, 이를 파이프(pipe)라고 한다.
예를 들어 다음 명령어는 ls -al의 출력 결과 중에서 exp가 포함된 줄만 보여준다.
1
ls -al | grep "exp"
즉, grep은 파일 내용뿐만 아니라 다른 명령어의 출력 결과를 필터링할 때도 자주 사용된다.
find 명령어
find는 특정 경로 아래에서 파일이나 디렉토리를 찾는 명령어이다.
예를 들어 현재 디렉토리와 그 하위 디렉토리에서 server.log 파일을 찾으려면 다음과 같이 입력한다.
1
find . -name "server.log"
현재 디렉토리 아래에서 .txt 확장자를 가진 모든 파일을 찾으려면 다음과 같이 입력한다.
1
find . -name "*.txt"
대소문자를 구분하지 않고 검색하고 싶다면 -iname 옵션을 사용하면 된다.
find {검색할 경로} -size {검색 조건}으로 특정 용량을 기준으로 필터링할 수 있다.
1
2
3
4
5
# 용량이 100MB 이상인 파일들만 찾기
find . -size +100M
# 용량이 10KB 이하인 파일들만 찾기
find . -size -10k
파일 내용 보기 및 편집
| 명령어 | 설명 | 사용 예시 |
|---|---|---|
cat | 파일의 전체 내용을 화면에 출력 (Concatenate) | cat {파일명} |
nano | 터미널 내에서 사용할 수 있는 텍스트 편집기 | nano {파일명} |
아래와 같은 .txt 파일이 있다고 가정한다.
[2023-10-26 09:00:01] INFO: System started successfully.
[2023-10-26 09:05:23] WARNING: High memory usage detected on CPU 1.
[2023-10-26 09:15:42] ERROR: Failed to connect to the database.
[2023-10-26 09:20:05] INFO: User 'admin' logged in from 192.168.0.1.
[2023-10-26 09:45:12] ERROR: Python script crashed unexpectedly.
[2023-10-26 10:00:00] INFO: Scheduled backup completed.
[2023-10-26 10:12:33] WARNING: Disk space is running low (85% used).
nano를 이용하면 아래의 창으로 진입하게 된다.텍스트를 수정한 뒤
Ctrl + O를 누르면 변경 사항을 저장할 수 있고, 저장하지 않고 그대로 빠져나오려면Ctrl + X를 누르면 된다.
용량 확인
| 명령어 | 설명 | 형식 | 사용 예시 |
|---|---|---|---|
df | HDD나 SSD의 전체 용량과 남은 여유 공간 출력 (Disk Free) | df {옵션} {디렉토리} | |
du | 특정 폴더나 파일이 디스크 용량을 얼마나 차지하는지 출력 (Disk Usage) | du {옵션} {디렉토리} |
df와du를 그냥 사용하면 용량이 Byte 단위로 표기된다.
이때-h(human-readable) 옵션을 사용하면, K(킬로), M(메가), G(기가) 단위로 바꿔서 보여준다.df와du를 그냥 사용하면 모든 파일 목록이 다 출력된다.
이때-s(summary) 옵션을 사용하면, 총합만 요약해서 보여준다.1 2 3 4 5 6 7 8 9 10 11 12 13
# 현재 위치에 있는 모든 내용물의 총 용량 확인 user@server:~$ du -sh . > 100G . # 특정 폴더가 차지하는 용량 확인 user@server:~$ du -sh /var/log > 50G /var/log # 현재 위치에 있는 모든 폴더/파일의 용량을 각각 요약해서 출력 user@server:~$ du -sh * > 80G Train_Folder 4.0K test.py 19G Exp_Folder
결과를 용량 순으로 정렬하고 싶다면
|와sort명령어를 결합하여du -sh * | sort -h형태로 사용하기도 한다.1 2 3 4
user@server:~$ du -sh * | sort -h > 80G Train_Folder 19G Exp_Folder 4.0K test.py
프로세스 관리
| 명령어 | 설명 | 사용 예시 |
|---|---|---|
ps | 현재 실행 중인 프로세스들의 목록 출력 (Process Status) | - |
kill | 프로그램이나 프로세스를 강제 종료 | kill -9 {PID} |
네트워크 통신
| 명령어 | 설명 | 사용 예시 |
|---|---|---|
ping | 특정 서버나 웹사이트가 살아있는지 신호를 보내 확인 (인터넷 연결이 잘 되는지) | ping {도메인 이름/IP 주소} |
wget | 웹 상에 있는 파일을 내 컴퓨터로 다운로드 (Web Get) | wget {웹 URL} |
curl | 웹 주소로 데이터를 보내거나 가져옴 (Client URL) | curl {웹 URL} |
ifconfig / ip | 내 컴퓨터의 IP 주소와 네트워크 인터페이스 정보 확인 | - |
wget은 인터넷의 파일을 내 컴퓨터로 다운로드하기 위해 사용한다.주로 무거운 설치 파일이나 압축 파일을 받을 때 사용한다.
1 2
# 아나콘다 설치 파일을 내 컴퓨터로 다운로드 wget https://repo.anaconda.com/archive/Anaconda3-2023.09-0-Linux-x86_64.shcurl은 파일 다운로드도 가능하지만, 그보다는 웹 서버에 데이터를 보내고, 요청하고, 결과값을 받아오는 통신에 특화된 명령어다.따라서 명령어를 입력하면 파일로 저장하지 않고 결과물을 터미널 창에 출력하기 때문에, 주로 API 결과값을 화면에서 바로 확인할 때 사용한다.
1 2 3 4 5 6 7 8
# ChatGPT API를 이용해 질문에 대한 답변 출력 curl https://api.openai.com/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer My_OPENAI_API_KEY" \ -d '{ "model": "gpt-3.5-turbo", "messages": [{"role": "user", "content": "지금 서울의 시간은?"}] }'
압축 및 해제
| 명령어 | 설명 | 사용 예시 |
|---|---|---|
tar | 여러 파일을 하나의 파일로 묶거나, 묶은 파일을 해제 | tar {옵션} {파일/폴더명} {도착 폴더} |
zip / unzip | .zip 형식으로 압축하거나 압축을 해제 | - |
- 보통 리눅스나 서버 환경끼리는
tar.gz형식을 표준처럼 사용하고, 윈도우 사용자와 파일을 주고받을 때는zip형식을 주로 사용한다. - 일반적으로 압축할 때는
tar -cvzf를, 압축 해제할 때는tar -xvzf를 사용한다.
기타 명령어
| 명령어 | 설명 | 사용 예시 |
|---|---|---|
history | 내가 지금까지 터미널에 입력했던 명령어 기록 | - |
alias | 긴 명령어를 짧은 단축어로 만듦 | alias {단축어}={'원래명령어'} |
clear | 터미널 화면을 깨끗하게 지움 | - |
echo | 내가 입력한 글자를 터미널 화면에 그대로 출력 (프로그래밍 언어의 print() 함수와 같은 역할) | echo {텍스트} |
alias사용법은 다음과 같다.1 2 3 4 5 6 7 8
# 'ls -al'을 매번 치기 귀찮을 때 'll'이라는 단축어 생성 alias ll='ls -al' # 현재 설정된 모든 alias 목록 보기 alias # 설정한 단축어 'll' 삭제 unalias ll
echo와 redirection 기호>,>>를 함께 사용하면,nano같은 편집기를 열지 않고도 밖에서 파일에 바로 글자를 밀어 넣을 수 있다.1 2 3 4 5
# 덮어쓰기 (>): hello.txt 파일에 "Hello World"를 적는다. (기존 내용이 있으면 지우고 덮어씀) echo "Hello World" > hello.txt # 이어쓰기 (>>): hello.txt 파일의 맨 아랫줄에 "Nice to meet you"를 추가한다. echo "Nice to meet you" >> hello.txt



