리눅스 CLI (Command Line Interface) 명령어
우리는 일반적으로 터미널에서 Bash와 같은 shell을 이용해 리눅스 환경과 상호작용한다.
보통은 터미널에서 사용하는 명령어를 통틀어 리눅스 명령어라고 부르기는 하지만, 실제로는 명령어가 여러 종류로 나뉜다.
- Shell builtin (Shell 내장 명령어): shell 자체에 내장된 명령어
- External command (외부 명령어): shell이 처리할 수 없는 복잡한 일들을 처리하기 위해, 리눅스 OS 내부에 별도의 실행 파일로 존재하는 명령어
터미널에 type <명령어>를 사용하면 내가 지금 입력하는 명령어가 어떤 종류인지 확인할 수 있다.
type cd실행 결과:cd is a shell builtintype cat실행 결과:cat is /usr/bin/cat
리눅스에서는 보통 디렉토리(directory)라는 용어를 사용한다.
폴더는 디렉토리를 사용자에게 친숙하게 표현한 말로 거의 같은 의미이며, 경로(path)는 파일이나 디렉토리가 위치한 주소를 의미한다.
아래에서는 자주 사용하는 CLI 명령어를 용도별 정리했다.
경로와 디렉토리 이동
| 명령어 | 설명 | 기본 사용법 |
|---|---|---|
pwd | 현재 위치의 절대 경로 출력 | pwd |
ls | 현재 위치에 있는 파일과 디렉토리 목록 출력 | ls |
cd | 다른 디렉토리로 이동 | cd project |
ls
-a 옵션은 숨김 파일까지 포함하여 출력하고, -l 옵션은 권한, 소유자, 크기, 심볼릭 링크 등의 상세 정보를 함께 출력한다.
따라서 두 옵션을 함께 사용하는 ls -al을 자주 사용한다.
파일 및 디렉토리 관리
| 명령어 | 설명 | 기본 사용법 |
|---|---|---|
mkdir | 새로운 디렉토리 생성 | mkdir data |
rm | 파일 또는 디렉토리 삭제 | rm memo.txt |
cp | 파일 또는 디렉토리 복사 | cp source destination |
mv | 파일 또는 디렉토리 이동·이름 변경 | mv source destination |
rm
파일을 삭제할 때는 rm <파일명> 형태로 사용한다.
디렉토리와 그 안의 내용을 함께 삭제하려면 -r 옵션을 추가한 rm -r <디렉토리명> 형태로 사용한다.
cp
파일을 복사할 때는 cp <원본 파일명> <복사할 파일명> 형태로 사용한다.
예를 들어 report.txt를 동일한 내용의 report_backup.txt로 복사하려면, cp report.txt report_backup.txt과 같이 입력한다.
이때 report_backup.txt의 존재 여부에 따라 두 가지 경우로 나뉜다.
- 존재하지 않는 경우:
report.txt와 동일한 내용의report_backup.txt가 새로 생성된다. - 이미 존재하는 경우: 기존
report_backup.txt의 내용을report.txt의 내용으로 덮어쓴다.
파일을 다른 디렉토리로 복사할 때는 cp <원본 파일명> <복사할 디렉토리> 형태로 사용한다.
디렉토리를 복사하려면 -r 옵션을 추가한 cp -r <원본 디렉토리명> <복사할 위치> 형태로 사용한다.
예를 들어 data 디렉토리를 data_backup이라는 이름으로 복사하려면, cp -r data data_backup과 같이 입력한다.
이때 data_backup의 존재 여부에 따라 두 가지 경우로 나뉜다.
- 존재하지 않는 경우:
data의 복사본이data_backup이라는 이름으로 새로 생성된다. 이미 존재하는 경우:
data디렉토리 자체가data_backup안으로 복사되어 다음과 같은 구조가 된다. (파일과 다름)data_backup/ └── data/
mv
파일 또는 디렉토리를 다른 위치로 이동할 때는 mv <파일 또는 디렉토리명> <이동할 위치> 형태로 사용한다.
cp와 달리 디렉토리를 이동할 때도 -r 옵션이 필요하지 않다.
또한 mv <기존 이름> <새 이름> 형태로 사용하여 파일이나 디렉토리의 이름을 변경할 수도 있다.
파일 내용 보기 및 편집
| 명령어 | 설명 | 기본 사용법 |
|---|---|---|
cat | 파일의 전체 내용을 출력 | cat server.log |
head | 파일 앞부분 확인 | head server.log |
tail | 파일 뒷부분 확인 | tail server.log |
nano | 터미널 기반 텍스트 편집기 | nano memo.txt |
head / tail
파일의 처음 부분만 확인하려면 head, 마지막 부분을 확인하려면 tail을 사용한다.
기본적으로 10줄을 출력하며, -n <출력할 줄 수> 옵션을 사용해서 출력할 줄 수를 직접 지정할 수도 있다.
실시간으로 추가되는 로그를 확인할 때는 tail -f가 자주 사용된다.
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를 누르면 된다.
파일 및 문자열 검색
| 명령어 | 설명 | 기본 사용법 |
|---|---|---|
grep | 특정 문자열이 포함된 줄 검색 | grep "ERROR" server.log |
find | 조건에 맞는 파일·디렉토리 검색 | find . -name "server.log" |
주로 find는 파일 또는 디렉토리 자체를 검색할 때, grep은 파일 내용이나 명령어 출력에서 특정 문자열을 검색할 때 사용한다.
grep
grep은 텍스트 파일 안에서 특정 문자열이 포함된 줄을 찾아 출력하는 명령어로, grep "<찾을 문자열>" <파일 경로> 형태로 사용한다.
기본적으로 grep은 대문자와 소문자를 구분하며, 대소문자를 무시하려면 -i 옵션을 사용한다.
grep은 파일 내용뿐만 아니라 다른 명령어의 출력 결과를 필터링할 때도 자주 사용된다.
ls -al | grep "exp"
위 명령어는 ls -al의 출력 중 exp가 포함된 줄만 출력한다.
또한 현재 디렉토리와 그 하위 디렉토리의 파일까지 모두 검색하려면 -r 옵션을 추가하여 grep -r "<찾을 문자열>" . 형태로 사용한다.
find
find는 특정 경로 아래에서 조건에 맞는 파일이나 디렉토리를 검색하는 명령어로, find <검색할 경로> <검색할 조건> 형태로 사용한다.
예를 들어 현재 디렉토리와 하위 디렉토리에서 server.log 파일을 찾으려면, find . -name "server.log"과 같이 입력한다.
현재 디렉토리 아래에서 .txt 확장자를 가진 모든 파일을 찾으려면, find . -name "*.txt"과 같이 입력한다.
대소문자를 구분하지 않고 검색하고 싶다면 -iname 옵션을 사용하면 된다.
또한 find <검색할 경로> -size <용량> 형태로 사용해서, 특정 용량을 기준으로 필터링할 수 있다.
# 용량이 100MB 이상인 파일들만 찾기
find . -size +100M
# 용량이 10KB 이하인 파일들만 찾기
find . -size -10k
디스크 용량 확인
| 명령어 | 설명 | 기본 사용법 |
|---|---|---|
df | 파일시스템의 전체 용량과 남은 공간 확인 | df -h |
du | 파일·디렉토리가 차지하는 용량 확인 | du -sh data |
df와 du를 그냥 사용하면 기본적으로 Byte 단위로 출력된다.
이때 -h (human-readable) 옵션을 사용하면, 용량을 K(킬로), M(메가), G(기가)와 같이 읽기 쉬운 단위로 표시한다.
df는 파일시스템 전체의 사용량을 확인할 때 사용하고, du는 특정 파일이나 디렉토리가 실제로 차지하는 용량을 확인할 때 사용한다.
du
du는 기본적으로 하위 디렉토리의 용량까지 함께 출력한다.
전체 용량만 확인하려면 -s (summary) 옵션을 사용한다.
du -sh .: 현재 디렉토리 전체가 차지하는 용량 확인출력 예시:
100G .du -sh /var/log: 특정 디렉토리가 차지하는 전체 용량 확인출력 예시:
50G /var/logdu -sh *: 현재 디렉토리의 각 파일과 디렉토리가 차지하는 용량을 각각 출력출력 예시:
80G Train_Folder 4.0K test.py 19G Exp_Folder
결과를 용량 순으로 정렬하려면 파이프(|)를 이용해 sort 명령어와 함께 사용할 수 있다.
# 작은 용량부터 정렬
du -sh * | sort -h
# 큰 용량부터 정렬
du -sh * | sort -hr
프로세스 관리
| 명령어 | 설명 | 기본 사용법 |
|---|---|---|
ps | 실행 중인 프로세스 정보 출력 | ps aux |
top | 프로세스 상태를 실시간으로 확인 | top |
kill | 프로세스에 종료 신호 전달 | kill <PID> |
ps
ps aux에서 aux는 옵션이다.
a: 다른 사용자의 프로세스도 표시u: 사용자 중심의 상세 형식으로 표시x: 터미널에 연결되지 않은 프로세스도 표시
kill
프로세스를 종료하려면 먼저 PID를 확인한 뒤 kill을 사용한다.
kill 12345
일반적인 kill은 프로세스가 스스로 종료할 기회를 주는 종료 신호를 보낸다.
그래도 종료되지 않는 경우에만 강제로 종료하는 -9 옵션을 사용할 수 있다.
kill -9 12345
네트워크 통신
| 명령어 | 설명 | 기본 사용법 |
|---|---|---|
ping | 대상 호스트와 네트워크 연결 상태 확인 | ping example.com |
wget | 웹의 파일을 다운로드 | wget <URL> |
curl | HTTP 요청을 보내고 응답 확인 | curl <URL> |
ip | 네트워크 인터페이스와 IP 정보 확인 | ip addr |
wget
wget은 웹에 있는 파일을 다운로드할 때 자주 사용한다.
wget https://example.com/file.tar.gz
특히 설치 파일이나 데이터셋처럼 파일 자체를 내려받을 때 편리하다.
curl
curl은 HTTP 요청을 보내고 서버의 응답을 확인할 때 자주 사용한다.
curl https://example.com
파일 다운로드도 가능하지만, API 요청이나 HTTP 헤더 확인 등 웹 서버와 직접 통신할 때 특히 많이 사용된다.
또한 명령어를 입력하면 파일로 저장하지 않고 결과물을 터미널 창에 출력하기 때문에, 주로 API 결과값을 화면에서 바로 확인할 때 사용한다.
# 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 -czf archive.tar.gz data/ |
zip | .zip 파일 생성 | zip -r archive.zip data/ |
unzip | .zip 파일 해제 | unzip archive.zip |
보통 리눅스나 서버 환경끼리는 tar.gz 형식을 표준처럼 사용하고, 윈도우 사용자와 파일을 주고받을 때는 zip 형식을 주로 사용한다.
tar
디렉토리를 tar.gz 형식으로 묶고 압축할 때는 주로 -czf 옵션과 함께, 해제할 때는 -xzf 옵션과 함께 사용한다.
# data/ 디렉토리를 data.tar.gz 파일로 압축
tar -czf data.tar.gz data/
# data.tar.gz 파일을 현재 디렉토리에 압축 해제
tar -xzf data.tar.gz
옵션의 의미는 다음과 같다.
c: 새로운 archive 생성x: archive 해제z: gzip 사용f: archive 파일 이름 지정v: 처리되는 파일을 화면에 출력
따라서 처리 과정을 화면에서 보고 싶다면 v를 추가할 수 있다.
기타 Shell 명령어
| 명령어 | 설명 | 기본 사용법 |
|---|---|---|
history | 지금까지 터미널에 입력했던 명령어 기록 확인 | history |
alias | 긴 명령어에 짧은 별칭 지정 | alias ll='ls -al' |
clear | 터미널 화면 정리 | clear |
echo | 문자열이나 변수 값을 출력 | echo “Hello” |
alis
자주 사용하는 긴 명령어에 짧은 이름을 붙일 수 있다.
alias ll='ls -al' 처럼 등록해 놓으면, 이후에는 ll만 입력해서 사용할 수 있다.
현재 설정된 alias 목록은 alias 명령어를 사용해서 확인할 수 있다.
등록한 alias를 삭제하려면 unalias를 사용한다.
unalias ll
터미널에서 직접 만든 alias는 현재 셸 세션이 종료되면 사라진다.
따라서 계속 사용하려면 아래처럼 ~/.bashrc 등에 등록해야 한다.
echo "alias ll='ls -al'" >> ~/.bashrc && source ~/.bashrc
echo
echo는 문자열이나 변수 값을 터미널에 출력한다.
프로그래밍 언어의 print()와 비슷한 용도로 생각할 수 있으며, redirection과 함께 파일에 간단한 내용을 기록할 때도 자주 사용한다.
Shell에서 명령어 연결
리눅스 CLI에서는 하나의 명령어만 사용하는 것보다 여러 명령어를 연결하거나 출력 방향을 바꾸어 사용하는 경우가 많다.
Pipe |
파이프(pipe)는 앞 명령어의 출력 결과를 다음 명령어의 입력으로 전달한다.
ls -al | grep "exp"
실행 흐름은 다음과 같다.
ls -al
↓
출력 결과
↓
grep "exp"
↓
exp가 포함된 줄만 출력
Redirection > / >>
Redirection은 명령어의 출력을 화면 대신 파일로 보낼 때 사용한다.
>는 파일을 새로 쓰거나 기존 내용을 덮어쓴다.`echo "Hello World" > hello.txt`>>는 기존 내용을 유지한 채 파일의 마지막에 내용을 추가한다.`echo "Nice to meet you" >> hello.txt`



