카테고리 없음

ABC 부트캠프 AI 파일럿 1기 MLOps 55일차: 개인 실습일, 압축 명령어 세 개가 너무 헷갈린다

개발 기록자 2026. 10. 21. 18:14

오늘 오전은 실습 위주로 진행되었다.

실습 너 무 좋 ㅇ ㅏ ~

내가 어느 부분에서 부족한지 한눈에 보이고

근육지식을 활용하거나 팀원들에게 알려주고 물어보면서

하나하나 해결해가는 과정이 뿌듯했다.

어제는 구축까지 진행했다.

||의 의미: 앞 명령이 실패하면 뒤 명령을 실행

여기서 /는 루트(root) 디렉터리, 곧 리눅스 파일 시스템의 맨 꼭대기 경로

df에 넘기는 인자로 루트가 들어 있는 디스크의 용량만 보여 달라는 의미

이제 또 다른 개인 실습의 시작이다

이 문제들은 교수님이 공유해주신 노션에 있다 !!

테크노트를 쓰고 있는 이 시점은 8번을 하고 있다 . . .

더이상 머리에 정보가 안들어온다.


L01. 내 작업 폴더 찾아가기

pwd
/home/hs/Developments/ai-campus/linux-submission-lab

cd data
ls
app.conf  app.log  fruits.txt  metrics.csv  users.txt

cd ~      # 홈으로
cd -      # 직전 위치로 돌아오기

ls -al
backup  data  reports  scripts  submission  work

cd - 는 바로 전에 있던 폴더로 돌아가는 것.
홈 갔다가 다시 돌아올 때 경로를 다시 안 쳐도 돼서 편하다.


L02. 파일을 복사해서 따로 보관하기

# work/project/docs 에서
touch todo.txt
cp todo.txt todo_copy.txt
ls
todo.txt  todo_copy.txt

mv todo_copy.txt ../done.txt     # 옮기면서 이름 바꾸기

# 실습 폴더에서
cp data/app.conf work/service.conf
cp data/app.conf backup/app.conf

# work 에서
touch delete_me.txt
rm delete_me.txt

mv 하나로 옮기기랑 이름 바꾸기가 같이 된다.
../done.txt 처럼 경로 끝에 새 이름을 붙이면 옮기면서 이름까지 바뀐다.


L03. 기록을 읽고 짧은 메모 남기기

head -n 2 app.log
2026-10-17 09:00:00 INFO service_started
2026-10-17 09:01:00 INFO healthcheck_ok

tail -n 2 app.log
2026-10-17 09:10:00 INFO recovery_completed
2026-10-17 09:11:00 INFO service_ready

wc -l app.log
12 app.log

head 는 앞에서부터, tail 은 뒤에서부터.
wc -l 은 줄 수.

메모 파일은 touch work/log_memo.txt 로 만들고 cat 으로 다시 읽어봤다.


L04. 필요한 내용만 골라서 저장하기

grep ERROR data/app.log
2026-10-17 09:03:00 ERROR database_timeout
2026-10-17 09:06:00 ERROR prediction_failed
2026-10-17 09:09:00 ERROR upstream_unavailable

grep ERROR data/app.log > error.txt
grep WARN data/app.log > reports/waring.txt

과일 이름별 등장 횟수는 힌트가 sort, uniq -c 였다.

sort data/fruits.txt | uniq -c
      3 apple
      2 banana
      1 orange

sort data/fruits.txt | uniq -c > reports/fruits_count.txt

-> 어려웠는데 스스로 해결했다 !

metrics.csv 는 맨 위 제목 줄을 빼고 첫 번째 열만 세야 했다.

tail -n +2 data/metrics.csv | sort | cut -c 1 | uniq -c
      2 a
      2 w

tail -n +2 는 2번째 줄부터 끝까지 보여주는 것. 제목 줄이 빠진다.

-> 이것도 어려웠는데 스스로 해결했다 !

mode=training 을 mode=practice 로 바꾸는 건 블로그의 도움을 받았다.

sed 's/training/practice/g' work/app.practice.conf
app=demo-service
mode=practice

s/찾을것/바꿀것/ 이 바꾸기 문법이다.


Q. sed 말고 설정 파일을 바꾸는 방법은?

여러 가지 있었다.

 

스크립트로 자동화할 때는 결국 sed -i 를 제일 많이 쓴다고 한다.
-i 를 붙이면 화면에만 보여주는 게 아니라 파일에 바로 저장된다.
그래서 원본을 지키려면 -i 없이 쓰고 > 로 다른 파일에 저장해야 한다.


L05. 파일의 실행 허용 표시와 오류 안내 확인하기

ls -ld work/log_memo.txt
-rw-r--r-- 1 hs hs 0 Oct 21 13:46 work/log_memo.txt

chmod 744 work/log_memo.txt
ls -ld work/log_memo.txt
-rwxr--r-- 1 hs hs 0 Oct 21 13:46 work/log_memo.txt

chmod 644 work/log_memo.txt
-rw-r--r-- 1 hs hs 0 Oct 21 13:46 work/log_memo.txt

rwx 숫자가 기억이 안 나서 검색해보았다.

r = 4
w = 2
x = 1

7 = 4+2+1 (rwx)
6 = 4+2   (rw-)
4 = 4     (r--)

일반 출력과 오류 안내를 따로 저장하는 문제도 있었다.

bash data/missing.log 1> reports/stdout.txt 2> reports/stderr.txt
ls reports/
fruits_count.txt  stderr.txt  stdout.txt  text_files.txt  warning.txt

1> 은 일반 출력, 2> 는 오류 출력.
2>&1 뭐 이런 명령어라는 건 알았는데 정확하게 개념을 확립하지 못한 상태였다.

실행 허용 표시랑 실제로 실행 가능한지의 차이는 이렇게 적었다.

 

실행 허용 표시 : 실행 권한 여부

파일 내용이 실제로 실행 가능한지 : 소스 파일이 정상적으로 실행되는지에 따라 다르다


L06. 내가 시작한 작업을 확인하고 끝내기

sleep 300 을 터미널 뒤에서 실행하라고 했다.

터미널 뒤가 백그라운드인지 찾아봤다.
처음엔 sleep 자체가 백그라운드 용어인 줄 알았다.
sleep 은 그냥 정해진 초만큼 기다리는 프로그램이다.

 

sleep 300 : 포그라운드. 300초 동안 터미널이 멈춘다

sleep 300 &: 백그라운드. 바로 다음 명령을 칠 수 있다

 

끝에 붙인 & 가 백그라운드로 실행하라는 표시이다.

sleep 300 &
[1] 4443

jobs -l
[1]+  4443 Running                 sleep 300 &

kill 4443
[1]+  Terminated              sleep 300

jobs 만 치면 작업 번호만 나오고, -l 을 붙이면 PID 까지 같이 나온다.
kill 은 이름은 무섭지만 기본은 종료 요청(SIGTERM)을 보내는 것이다.


Q. 작업 번호와 PID의 차이는?

작업 번호는 지금 쓰고 있는 터미널이 백그라운드 작업마다 붙여주는 순번이다.

[1] 4443 에서 [1] 이 작업 번호, 4443 이 PID.
kill %1 이랑 kill 4443 은 같은 걸 끈다.
다른 터미널 창에서는 jobs 에 안 보이니까 그때는 PID 로 찾아야 한다.


Q. ps aux | grep train | grep -v grep 에서 grep -v 를 붙이는 이유?

grep -v 는 일치하는 줄을 빼고 나머지만 보여주는 것.

ps aux | grep train 만 치면 grep train 명령 자기 자신도 프로세스라서 목록에 같이 찍힌다.
그래서 grep -v grep 으로 그 줄을 빼는 것이다.

 

ps aux : 모든 사용자의 프로세스를 자세히 보기

a 모든 사용자 / u 사용자 중심 형식 / x 터미널에 안 붙은 것까지


Q. || 의 의미는?

앞 명령이 실패하면 뒤 명령을 실행.

ps aux | grep train | grep -v grep || echo "실행중없음"

grep 은 찾으면 성공(0), 못 찾으면 실패(1)를 돌려준다.
파이프로 이은 건 맨 마지막 명령 결과로 판단한다.
그래서 train 이 안 돌고 있으면 실행중없음 이 찍힌다.

 

A || B : A 가 실패하면 B

A && B : A 가 성공하면 B


Q. df -h / 에서 / 의 의미는?

여기서 / 는 루트(root) 디렉터리, 곧 리눅스 파일 시스템의 맨 꼭대기 경로다.
df 에 넘기는 인자로, 루트가 들어 있는 디스크의 용량만 보여 달라는 의미.

df -h / | tail -1 은 제목 줄을 버리고 실제 정보 한 줄만 남기는 것이다.

L06 4번에서는 실습 폴더가 있는 저장 공간을 봐야 해서 / 대신 . 을 넣었다.

df -h .
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdd       1007G  4.2G  952G   1% /

du -sh reports
20K     reports

처음엔 du -sh . 로 남은 용량을 보려고 했다.
du 는 폴더가 쓰고 있는 양이고, df 의 Avail 이 남은 양이다.

 

du : disk usage, 내 짐이 차지한 부피

df : disk free, 창고에 남은 빈 공간

 

리눅스 부분은 다 검색해서 풀었다.
근데 검색어가 잘 기억나지 않는다.


L07. 여러 파일을 한 묶음으로 보관하고 다시 풀기

tar -zcvf archive.tar.gz data
data/
data/metrics.csv
data/users.txt
data/app.log
data/fruits.txt
data/app.conf

tar -ztvf archive.tar.gz
drwxr-xr-x hs/hs             0 2026-10-21 13:11 data/
-rw-r--r-- hs/hs            56 2026-10-21 13:11 data/metrics.csv
-rw-r--r-- hs/hs            24 2026-10-21 13:11 data/users.txt
-rw-r--r-- hs/hs           500 2026-10-21 13:11 data/app.log
-rw-r--r-- hs/hs            39 2026-10-21 13:11 data/fruits.txt
-rw-r--r-- hs/hs            31 2026-10-21 13:11 data/app.conf

mkdir work/restored && tar -zxvf archive.tar.gz -C work/restored

복원된 파일이 원본이랑 같은지는 줄 수로 비교했다.

wc -l data/app.conf && wc -l data/app.log && wc -l work/restored/data/app.conf && wc -l work/restored/data/app.log
2 data/app.conf
12 data/app.log
2 work/restored/data/app.conf
12 work/restored/data/app.log

풀었는데 ls 가 그대로였다

처음에 -C 없이 실습 폴더에서 바로 tar -zxvf archive.tar.gz 를 쳤다.
파일 이름은 쭉 찍히는데 ls 를 해보면 바뀐 게 없었다.

원인은 data 폴더가 원래부터 있었기 때문이다.
새 폴더가 생긴 게 아니라 기존 data/ 안의 파일을 덮어쓴 것이다.
tar 는 같은 이름이 있으면 묻지도 않고 덮어쓴다.

그래서 다른 폴더에 풀려면 -C 를 붙여야 한다.


Q. -C 에는 이미 있는 폴더만 쓸 수 있을까?

있는 폴더만 된다.

-C 는 그 폴더로 이동(Change directory)한 다음 푸는 것이라 없는 폴더면 에러가 난다.

tar -zxvf archive.tar.gz -C newdir
tar: newdir: Cannot open: No such file or directory

그래서 mkdir -p 랑 && 로 묶는다.

mkdir -p newdir && tar -zxvf archive.tar.gz -C newdir

-p 는 폴더가 이미 있어도 에러를 안 내니까 그냥 항상 이렇게 쓰면 된다.


Q. zcvf, ztvf, zxvf 의 차이는?

압축하는 명령어랑 압축 푸는 명령어랑 압축파일 안에 뭐가 있는지 확인하는 명령어가 너 무 너 무 너 무 헷갈린다.

알고 보니 z, v, f 는 셋 다 똑같고 가운데 글자 하나만 다르다.

압축파일 묶는 명령어      : tar -zcvf archive.tar.gz <압축할 파일>
안에 뭐가 있는지 확인     : tar -ztvf <압축 파일>
압축파일 푸는 명령어      : tar -zxvf <압축파일> -C <푸는 경로>

c, t, x 는 같이 못 쓴다. 셋 중 하나만 고르는 것이다.
z v f 는 고정이고 가운데만 c(만들기) / t(목록) / x(꺼내기) 로 바꾼다고 외워야겠다.


Q. tar 와 tar.gz, 그리고 zip 의 차이는?

.tar 는 묶기만 한 것, .tar.gz 는 묶고 나서 gzip 으로 압축까지 한 것이다.
tar 는 원래 tape archive 의 줄임말이라고 한다.

리눅스 서버끼리 주고받을 때는 tar.gz, 윈도우 쓰는 사람한테 보낼 때는 zip.

 


압축하는 명령어랑 압축 푸는 명령어랑 압축파일 안에 뭐가 있는지 확인하는 명령어가 너 무 너 무 너 무 헷갈린다

압축파일 묶는 명령어 : tar -zcvf archive.tar.gz <압축할 파일>
압축파일에 어떤 파일이 있는지 확인하는 명령어 : tar -ztvf <압축 파일>
압축파일 푸는 명령어 : tar -zxvf <압축파일> -C <압축파일 푸는 경로>

 


L08. 조사 결과를 한 번에 제출하기

mkdir -p submission/linux/final
touch submission/linux/final/{errors,summary,fruits_count}.txt

cp data/app.log submission/linux/final/app_original.log
grep ERROR submission/linux/final/app_original.log > submission/linux/final/error.txt

touch 뒤에 {a,b,c} 를 쓰면 파일 여러 개가 한 번에 생긴다.
중괄호 안에 띄어쓰기를 넣으면 안 된다.

전체 줄 수, ERROR 줄 수, WARN 줄 수를 summary.txt 에 적는 문제.

wc -l app_original.log > summary.txt
grep -c ERROR app_original.log >> summary.txt
grep -c WARN app_original.log >> summary.txt

cat summary.txt
12 app_original.log
3
2

grep -c 는 일치하는 줄 수만 세는 것.
첫 줄은 > 로 새로 쓰고 나머지는 >> 로 덧붙였다.


wc -l 뒤에 파일명을 붙였더니

처음엔 한 줄로 이렇게 쳤다.

grep ERROR app_original.log | wc -l app_original.log >> summary.txt

 

이러면 ERROR 줄 수가 아니라 전체 줄 수가 또 찍힌다.
wc -l 뒤에 파일 이름을 적으면 파이프로 넘어온 grep 결과를 무시하고 그 파일을 다시 센다.

파이프로 받을 거면 wc -l 뒤에 파일명을 빼야 한다.
아니면 처음부터 grep -c 를 쓰면 된다.


사담

테크노트를 쓰고 있는 이 시점은 L8번을 하고 있다 . . .

더이상 머리에 정보가 안 들어온다.

2>&1 은 아직 개념이 확실하지 않다.

 


1>, 2> 로 나누는 건 해봤는데 둘을 합치는 건 다시 봐야겠다.
L08 남은 문제는 이어서 풀 예정이다.