Post

리눅스 CLI (Command Line Interface) 명령어

리눅스 CLI (Command Line Interface) 명령어

우리는 일반적으로 터미널에서 Bash와 같은 shell을 이용해 리눅스 환경과 상호작용한다.
보통은 터미널에서 사용하는 명령어를 통틀어 리눅스 명령어라고 부르기는 하지만, 실제로는 명령어가 여러 종류로 나뉜다.

  • Shell builtin (Shell 내장 명령어): shell 자체에 내장된 명령어
  • External command (외부 명령어): shell이 처리할 수 없는 복잡한 일들을 처리하기 위해, 리눅스 OS 내부에 별도의 실행 파일로 존재하는 명령어

터미널에 type <명령어>를 사용하면 내가 지금 입력하는 명령어가 어떤 종류인지 확인할 수 있다.

  • type cd 실행 결과: cd is a shell builtin
  • type cat 실행 결과: cat is /usr/bin/cat

리눅스에서는 보통 디렉토리(directory)라는 용어를 사용한다.
폴더는 디렉토리를 사용자에게 친숙하게 표현한 말로 거의 같은 의미이며, 경로(path)는 파일이나 디렉토리가 위치한 주소를 의미한다.

아래에서는 자주 사용하는 CLI 명령어를 용도별 정리했다.

경로와 디렉토리 이동

명령어설명기본 사용법
pwd현재 위치의 절대 경로 출력pwd
ls현재 위치에 있는 파일과 디렉토리 목록 출력ls
cd다른 디렉토리로 이동cd project

ls

-a 옵션은 숨김 파일까지 포함하여 출력하고, -l 옵션은 권한, 소유자, 크기, 심볼릭 링크 등의 상세 정보를 함께 출력한다.

따라서 두 옵션을 함께 사용하는 ls -al을 자주 사용한다.

fig1

파일 및 디렉토리 관리

명령어설명기본 사용법
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를 이용하면 아래의 창으로 진입하게 된다.

fig2

텍스트를 수정한 뒤 Ctrl + O를 누르면 변경 사항을 저장할 수 있고, 저장하지 않고 그대로 빠져나오려면 Ctrl + X를 누르면 된다.

파일 및 문자열 검색

명령어설명기본 사용법
grep특정 문자열이 포함된 줄 검색grep "ERROR" server.log
find조건에 맞는 파일·디렉토리 검색find . -name "server.log"

주로 find는 파일 또는 디렉토리 자체를 검색할 때, grep은 파일 내용이나 명령어 출력에서 특정 문자열을 검색할 때 사용한다.

grep

grep은 텍스트 파일 안에서 특정 문자열이 포함된 줄을 찾아 출력하는 명령어로, grep "<찾을 문자열>" <파일 경로> 형태로 사용한다.

기본적으로 grep은 대문자와 소문자를 구분하며, 대소문자를 무시하려면 -i 옵션을 사용한다.

fig3

grep은 파일 내용뿐만 아니라 다른 명령어의 출력 결과를 필터링할 때도 자주 사용된다.


ls -al | grep "exp"

위 명령어는 ls -al의 출력 중 exp가 포함된 줄만 출력한다.

fig4

또한 현재 디렉토리와 그 하위 디렉토리의 파일까지 모두 검색하려면 -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/log
  • du -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>
curlHTTP 요청을 보내고 응답 확인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`