개발자 필수 리눅스 명령어 30선 — 매일 쓰는 것만 골랐다
파일 조작부터 프로세스 관리, 네트워크, 디스크까지. 개발자가 실무에서 실제로 자주 쓰는 리눅스 명령어 30개를 정리.
리눅스 명령어 모음 글은 넘치는데, 정작 필요한 상황에서 "이거 어떻게 하더라?" 하면서 또 검색하게 된다. 교과서식으로 A부터 Z까지 나열하는 건 참고서지 실용 가이드가 아니다.
여기서는 서버를 다루거나 개발 환경에서 실제로 자주 마주치는 상황별로 정리했다. "이 상황에서 이 명령어"를 빠르게 찾을 수 있도록.
파일과 디렉토리
1. ls — 목록 보기
ls -la # 숨김 파일 포함, 상세 정보
ls -lh # 파일 크기를 사람이 읽기 쉽게 (KB, MB)
ls -lt # 수정 시간 순 정렬
-l은 거의 항상 붙인다. -a는 .env 같은 숨김 파일을 확인할 때 필수.
2. cd — 디렉토리 이동
cd ~ # 홈 디렉토리
cd - # 직전 디렉토리로 돌아가기
cd ../.. # 두 단계 상위
cd -를 모르는 사람이 의외로 많은데, 두 폴더를 왔다갔다 할 때 엄청 편하다.
3. cp, mv, rm — 복사, 이동, 삭제
cp -r src/ backup/ # 디렉토리 통째로 복사
mv old-name.txt new.txt # 이름 변경 (이동과 같은 명령)
rm -rf node_modules/ # 디렉토리 강제 삭제 (주의!)
rm -rf는 확인 없이 삭제하니까 항상 경로를 두 번 확인해야 한다. 특히 변수가 포함된 경로(rm -rf $DIR/)는 변수가 비어있으면 끔찍한 일이 벌어질 수 있다.
4. mkdir — 디렉토리 생성
mkdir -p src/components/ui # 중간 경로까지 한번에 생성
-p 옵션 없이 하면 중간 디렉토리가 없을 때 에러가 난다.
5. find — 파일 찾기
find . -name "*.log" # 현재 디렉토리에서 .log 파일 찾기
find . -name "*.tmp" -delete # 찾아서 삭제
find . -type f -mtime -1 # 최근 1일 내 수정된 파일
find . -size +100M # 100MB 넘는 파일
find는 옵션 조합이 강력하다. -name에는 와일드카드 쓸 때 따옴표로 감싸야 쉘이 먼저 해석하는 걸 막을 수 있다.
파일 내용 다루기
6. cat — 파일 내용 출력
cat config.yml # 전체 출력
cat file1.txt file2.txt # 여러 파일 연결 출력
짧은 파일 확인용. 긴 파일은 less를 쓰는 게 낫다.
7. less — 페이지 단위 보기
less /var/log/syslog
j/k로 위아래 이동, /검색어로 검색, q로 종료. vim 키바인딩이랑 비슷하다.
8. head, tail — 앞/뒤 일부만 보기
head -n 20 file.txt # 앞 20줄
tail -n 50 file.txt # 뒤 50줄
tail -f /var/log/app.log # 실시간 로그 추적
tail -f는 서버 로그를 실시간으로 모니터링할 때 쓴다. Ctrl+C로 종료.
9. grep — 텍스트 검색
grep "error" app.log # 파일에서 검색
grep -r "TODO" src/ # 디렉토리 재귀 검색
grep -i "warning" log.txt # 대소문자 무시
grep -n "function" script.js # 줄 번호 표시
grep -c "404" access.log # 매칭 횟수
개발할 때 가장 많이 쓰는 명령어 중 하나다. -r과 -n을 자주 조합한다. 더 빠른 대안으로 ripgrep(rg)도 있다.
10. wc — 줄/단어/바이트 수 세기
wc -l file.txt # 줄 수
find src/ -name "*.ts" | wc -l # TypeScript 파일 개수
11. sort, uniq — 정렬과 중복 제거
sort access.log | uniq -c | sort -rn | head -20
이 조합은 로그에서 가장 많이 나타나는 패턴을 찾을 때 유용하다. 접속 로그에서 가장 많이 요청된 URL이나 IP를 찾는다든지.
권한과 소유자
12. chmod — 권한 변경
chmod 755 deploy.sh # rwxr-xr-x (스크립트 실행 가능)
chmod 600 .env # rw------- (본인만 읽기/쓰기)
chmod +x script.sh # 실행 권한 추가
숫자가 뭘 뜻하는지: 4=읽기, 2=쓰기, 1=실행. 세 자리가 각각 소유자/그룹/기타에 대응. 7=4+2+1(전부), 5=4+1(읽기+실행), 0(없음).
13. chown — 소유자 변경
chown -R www-data:www-data /var/www/ # 디렉토리 소유자 변경
웹 서버 배포할 때 파일 소유자가 안 맞아서 403 에러 나는 경우가 종종 있다.
프로세스 관리
14. ps — 프로세스 목록
ps aux # 전체 프로세스
ps aux | grep node # node 관련 프로세스만
15. kill — 프로세스 종료
kill 12345 # PID로 종료 (SIGTERM)
kill -9 12345 # 강제 종료 (SIGKILL)
포트 충돌로 서버가 안 뜰 때, 해당 포트를 쓰는 프로세스를 찾아서 죽이는 패턴:
lsof -i :3000 # 3000번 포트 사용 중인 프로세스
kill $(lsof -t -i :3000) # 해당 프로세스 종료
16. top / htop — 시스템 모니터링
top # 기본 모니터
htop # 더 보기 좋은 버전 (설치 필요)
CPU, 메모리 사용량을 실시간으로 보여준다. 서버가 느려졌을 때 뭐가 자원을 잡아먹고 있는지 확인하는 첫 번째 도구.
17. nohup / & — 백그라운드 실행
nohup node server.js > output.log 2>&1 &
SSH 세션이 끊겨도 프로세스가 계속 돌게 하려면 nohup을 쓴다. 프로덕션에서는 PM2나 systemd를 쓰는 게 맞지만, 급할 때 임시로 쓸 수 있다.
네트워크
18. curl — HTTP 요청
curl https://api.example.com/data # GET 요청
curl -X POST -d '{"key":"value"}' -H "Content-Type: application/json" URL
curl -o file.zip https://example.com/file # 파일 다운로드
curl -I https://example.com # 헤더만 확인
API 테스트할 때 Postman 대신 빠르게 쓸 수 있다. -v 옵션을 붙이면 요청/응답 헤더를 전부 볼 수 있어서 디버깅에 좋다.
19. wget — 파일 다운로드
wget https://example.com/file.tar.gz
wget -r -l 1 https://example.com/docs/ # 재귀 다운로드
20. ss (또는 netstat) — 네트워크 연결 확인
ss -tlnp # 리스닝 중인 TCP 포트와 프로세스
"이 포트에서 뭐가 돌고 있지?" 할 때 쓴다. 예전에는 netstat을 썼는데 ss가 더 빠르다.
21. ping — 연결 확인
ping -c 4 google.com # 4번만 핑
서버 간 네트워크가 통하는지 가장 기본적인 확인.
디스크와 시스템
22. df — 디스크 사용량
df -h # 파티션별 사용량 (사람이 읽기 쉽게)
서버 디스크가 100% 차면 앱이 죽는다. 정기적으로 확인하는 습관이 필요하다.
23. du — 디렉토리별 용량
du -sh * # 현재 디렉토리의 각 항목 크기
du -sh node_modules/ # 특정 디렉토리 크기
du -h --max-depth=1 | sort -rh # 큰 디렉토리부터 정렬
디스크가 부족할 때 뭐가 공간을 잡아먹고 있는지 찾는 용도.
24. tar — 압축/해제
tar -czf backup.tar.gz src/ # 압축
tar -xzf backup.tar.gz # 해제
tar -tzf backup.tar.gz # 내용물만 확인
-create, e-xtract, -z gzip, -f file. "-czf는 압축, -xzf는 해제"로 외우면 된다.
텍스트 처리
25. sed — 스트림 편집
sed -i 's/old/new/g' file.txt # 파일 내 텍스트 치환
sed -n '10,20p' file.txt # 10~20번째 줄만 출력
26. awk — 필드 기반 텍스트 처리
awk '{print $1}' access.log # 첫 번째 필드 (보통 IP)
awk -F: '{print $1}' /etc/passwd # 구분자 지정
docker ps | awk '{print $1, $2}' # 컨테이너 ID와 이미지
sed와 awk는 깊게 파면 한없이 깊은데, 위의 패턴 정도만 알아도 실무에서 대부분 해결된다.
기타 유용한 것들
27. xargs — 파이프 결과를 인자로 전달
find . -name "*.log" | xargs rm # 찾은 파일 전부 삭제
git branch --merged | grep -v main | xargs git branch -d
28. watch — 명령어 반복 실행
watch -n 2 "docker ps" # 2초마다 컨테이너 상태 확인
29. history — 명령어 히스토리
history | grep "docker" # docker 관련 히스토리
!234 # 히스토리 234번 명령어 재실행
30. alias — 별칭 만들기
alias ll='ls -la'
alias gs='git status'
alias dc='docker compose'
~/.bashrc나 ~/.zshrc에 넣어두면 매번 긴 명령어를 안 쳐도 된다.
파이프와 리디렉션만 알면 조합이 무한대
리눅스 명령어의 진짜 힘은 개별 명령어가 아니라 조합에 있다.
# 파이프 (|) — 앞 명령의 출력을 뒤 명령의 입력으로
cat access.log | grep "POST" | wc -l
# 리디렉션 (>) — 출력을 파일로
echo "hello" > file.txt # 덮어쓰기
echo "world" >> file.txt # 이어쓰기
# 에러 리디렉션
command 2>/dev/null # 에러 메시지 숨기기
command > output.log 2>&1 # 표준 출력 + 에러를 한 파일에
30개 명령어를 전부 외울 필요는 없다. 자주 쓰는 건 손에 익고, 가끔 쓰는 건 이 글 같은 레퍼런스를 참고하면 된다. 중요한 건 "이런 게 가능하다"는 걸 아는 거다. 가능한 걸 알면 검색어가 떠오르니까.