| 글자 | 뜻 |
|---|---|
c |
만들기 (create) |
t |
목록 (list) |
x |
풀기 (extract) |
z |
gzip 으로 압축·해제 |
f |
다음 인자가 파일 이름 |
c·t·x 중 하나에 z 와 f 를 붙입니다. tar czf, tar tzf, tar xzf 세 조합이 전부입니다. v 를 넣으면 처리하는 파일 이름을 출력합니다.
tar czf app.tgz app # app 폴더를 app.tgz 로
tar tzf app.tgz # 안에 뭐가 있나
tar xzf app.tgz # 현재 폴더에 풀기
tar xzf app.tgz -C /opt # -C 지정 폴더에 풀기f 뒤에 파일 이름이 바로 와야 합니다. tar czf app app.tgz 처럼 순서가 바뀌면 app 이라는 파일을 만들려다 실패합니다.
tar czf conf.tgz -C app conf # app 으로 들어가서 conf 만, 경로는 conf/...
tar czf app.tgz --exclude='*.log' app # 로그 제외
tar xzf app.tgz app/conf/app.properties # 파일 하나만 꺼내기
tar xzOf app.tgz app/conf/app.properties # O: 풀지 않고 화면에-C 는 만들 때도 씁니다. tar czf conf.tgz app/conf 로 만들면 풀 때 app/conf/ 가 통째로 생기지만, -C app conf 로 만들면 conf/ 만 생깁니다. 풀리는 경로를 tzf 로 미리 보는 습관이 중요합니다.
| 확장자 | 도구 | 특징 |
|---|---|---|
.gz .tgz |
gzip | 빠름, 기본 |
.bz2 |
bzip2 | 더 작음, 느림 |
.xz .txz |
xz | 가장 작음, 가장 느림 |
.zip |
zip | Windows 호환 |
tar 의 z 는 gzip, j 는 bzip2, J 는 xz 입니다. 로그 보관은 gzip, 반출용 큰 파일은 xz, Windows 와 주고받으면 zip 입니다.
gzip big.log # big.log.gz 로 바뀌고 원본 삭제
gzip -k big.log # -k 원본 유지
gunzip big.log.gz # 풀기
zcat big.log.gz | head # 풀지 않고 읽기
zgrep ERROR big.log.gz # 풀지 않고 검색gzip 은 파일 하나만 다루고 폴더는 못 합니다. 그래서 폴더는 tar 로 먼저 묶습니다. 로그 보관은 gzip 만으로 충분하고 zcat·zgrep·zless 가 그대로 읽습니다.
zip -r app.zip app # 폴더째
unzip -l app.zip # 목록
unzip app.zip -d out # 지정 폴더에
unzip -o app.zip # 묻지 않고 덮어쓰기
unzip -p app.jar META-INF/MANIFEST.MF # 파일 하나를 화면에jar·war 도 zip 형식이라 unzip -l app.jar 로 안을 봅니다. 운영 묶음 04 의 버전 확인이 이 방식이었습니다.
| 옵션 | 뜻 |
|---|---|
-r |
폴더 재귀 |
-n |
줄 번호 |
-l |
파일 이름만 |
-c |
파일별 개수 |
-i |
대소문자 무시 |
--include='*.log' |
확장자 제한 |
--exclude-dir=node_modules |
폴더 제외 |
grep -rn 'db-dev' /opt/myapp/conf 가 "어느 파일 몇 번째 줄에 있나" 의 답입니다. -l 은 그 파일들에 sed 나 xargs 를 이어 붙일 때 씁니다.
find app -name '*.log' -size +100k # 이름 + 크기
find app -name '*.log' -mmin -5 # 5분 안에 수정
find app -type f -mtime +30 # 30일 넘음
find / -xdev -size +500M 2>/dev/null # 파티션 안 큰 파일01 레슨의 조건에 -size·-mmin 을 더했습니다. -xdev 는 다른 파티션으로 넘어가지 않고 2>/dev/null 이 권한 에러를 숨깁니다.
find app -type f -exec grep -l 'fail 2' {} + # 찾은 파일 안에서 검색
find app -name '*.properties' -mtime -1 | xargs grep -n 'db-'
find app -name '*.log' -print0 | xargs -0 grep -c ERROR # 공백 안전find 로 대상을 좁히고 grep 으로 내용을 봅니다. 파일 이름에 공백이 있을 수 있으면 -print0 과 xargs -0 짝을 씁니다.
sha256sum app.jar # 해시 출력
sha256sum app.jar > app.jar.sha256 # 파일로 저장
sha256sum -c app.jar.sha256 # app.jar: OK
md5sum app.jar # 옛 방식, 빠름
cmp a.jar b.jar && echo 같음 # 두 파일 직접 비교반출 측에서 .sha256 을 만들어 함께 옮기고 반입 측에서 -c 로 확인합니다. OK 가 아니면 다시 옮깁니다. 배포 스크립트 첫 단계로 넣으면 잘린 jar 로 배포하는 사고가 없습니다.
split -b 100m big.tgz part_ # 100MB 씩 part_aa part_ab ...
cat part_* > big.tgz # 순서대로 합치기
sha256sum -c big.tgz.sha256 # 합친 뒤 확인반입 매체 크기 제한이 있을 때 씁니다. cat 은 파일 이름 순으로 합치므로 split 의 기본 접미사 aa·ab 순서가 맞습니다.
tar czf "backup-$(date +%Y%m%d_%H%M%S).tgz" -C /opt/myapp conf
find /backup -name 'backup-*.tgz' -mtime +30 -delete날짜가 이름에 들어가 정렬되고 -mtime +30 -delete 로 오래된 것을 지웁니다. 운영 묶음 06 의 cron 에 넣으면 자동입니다.