본문 바로가기
IT일반/Linux

Command Line - 파일 보관 및 백업

by 버섯도리 2022. 5. 31.
[cmd_test@btjeon-naver ~]$ ls -l /etc > foo.txt
[cmd_test@btjeon-naver ~]$ ll foo.*
-rw-rw-r-- 1 cmd_test cmd_test 11785 Jun  1 09:33 foo.txt
[cmd_test@btjeon-naver ~]$ gzip foo.txt
[cmd_test@btjeon-naver ~]$ ll foo.*
-rw-rw-r-- 1 cmd_test cmd_test 2410 Jun  1 09:33 foo.txt.gz
[cmd_test@btjeon-naver ~]$ gunzip foo.txt
[cmd_test@btjeon-naver ~]$ ll foo.*
-rw-rw-r-- 1 cmd_test cmd_test 11785 Jun  1 09:33 foo.txt

gzip 명령어는 한 개 이상의 파일을 압축할 때 사용한다.

 

<gzip 옵션>

옵션 설명
-c 표준 출력에 결과를 쓰고, 원본 파일을 유지함. --stdout 및 -to-stdout으로도 사용할 수 있다.
-d 압축 해제. 이 옵션을 쓰면 gunzip과 같은 동작을 하게 된다. --decompress 또는 --uncompress로도 사용할 수 있다.
-f 압축 파일이 이미 존재해도 압축을 실행. --force로도 사용할 수 있다.
-h 도움말. --help로도 사용할 수 있다.
-l 각각의 압축 파일별로 압축 정보를 표시. --list로도 사용할 수 있다.
-r 커맨드라인의 인자가 디렉토리인 경우, 디렉토리를 순환하면서 포함되어 있는 파일들을 압축한다. --recursive로도 사용할 수 있다.
-t 압축 파일의 무결성을 검사한다. --test로도 사용할 수 있다.
-v 압축되는 과정을 자세히 표시한다. --verbose로도 사용할 수 있다.
-number 압축 정도를 설정. number에는 1(가장 빠르지만 압축률은 최소)부터 9(가장 느리지만 압축률은 최대)까지의 정수만 올 수 있다. 숫자 1과 9 대신 각각 --fast와 --best로도 사용될 수 있다. 기본값은 6.

 

[cmd_test@btjeon-naver ~]$ ls -l /etc | gzip > foo.txt.gz
[cmd_test@btjeon-naver ~]$ ll foo.*
-rw-rw-r-- 1 cmd_test cmd_test 11785 Jun  1 09:33 foo.txt
-rw-rw-r-- 1 cmd_test cmd_test  2402 Jun  1 09:45 foo.txt.gz

표준 출력을 통해 파일을 압축할 수 있다.

 

[cmd_test@btjeon-naver ~]$ bzip2 foo.txt
[cmd_test@btjeon-naver ~]$ ll foo.txt.bz2
-rw-rw-r-- 1 cmd_test cmd_test 2201 Jun  1 09:33 foo.txt.bz2
[cmd_test@btjeon-naver ~]$ bunzip2 foo.txt.bz2 
[cmd_test@btjeon-naver ~]$ ll foo.txt
-rw-rw-r-- 1 cmd_test cmd_test 11785 Jun  1 09:33 foo.txt

bzip2는 다른 알고리즘을 사용하는 압축 명령어인데, 속도는 느리지만 높은 압축률을 자랑한다.

 

[cmd_test@btjeon-naver ~]$ tar cf playground.tar playground

tar 아카이브 생성

 

[cmd_test@btjeon-naver ~]$ tar tf playground.tar
playground/dir-100/
playground/dir-100/file-A
playground/dir-100/file-B
playground/dir-100/file-C
playground/dir-100/file-D
playground/dir-100/file-E
...

tar 아카이브 내용 확인

 

[cmd_test@btjeon-naver ~]$ tar tvf playground.tar
drwx------ cmd_test/cmd_test 0 2022-05-28 17:26 playground/dir-100/
-rw------- cmd_test/cmd_test 0 2022-05-28 17:26 playground/dir-100/file-A
-rw------- cmd_test/cmd_test 0 2022-05-28 17:32 playground/dir-100/file-B
-rw------- cmd_test/cmd_test 0 2022-05-28 17:26 playground/dir-100/file-C
-rw------- cmd_test/cmd_test 0 2022-05-28 17:26 playground/dir-100/file-D
-rw------- cmd_test/cmd_test 0 2022-05-28 17:26 playground/dir-100/file-E
...

자세하게 내용을 표시하고 싶으면 v(verbose) 옵션이 필요하다.

 

[cmd_test@btjeon-naver ~]$ mkdir foo
[cmd_test@btjeon-naver ~]$ cd foo
[cmd_test@btjeon-naver foo]$ tar xf ../playground.tar
[cmd_test@btjeon-naver foo]$ ls
playground

아카이브 풀기. 슈퍼유저가 아닌 한, 아카이브에서 생성된 새로운 파일과 디렉토리들에 대해서는 원 소유자가 아닌 아카이브를 해제한 사용자의 소유가 된다.

 

[cmd_test@btjeon-naver ~]$ tar cf playground2.tar ~/playground
tar: Removing leading `/' from member names
[cmd_test@btjeon-naver ~]$ cd foo
[cmd_test@btjeon-naver foo]$ tar xf ../playground2.tar
[cmd_test@btjeon-naver foo]$ ls
home  playground
[cmd_test@btjeon-naver foo]$ ls home/
cmd_test
[cmd_test@btjeon-naver foo]$ ls home/cmd_test/
playground

압축 대상을 ~ 이하 경로명으로 지정할 경우 아카이브를 해제하면 절대경로 기준으로 파일이 생성된다.

 

[cmd_test@btjeon-naver foo]$ rm -r home/
[cmd_test@btjeon-naver foo]$ ls
playground
[cmd_test@btjeon-naver foo]$ tar xf ../playground2.tar --wildcards 'home/cmd_test/playground/dir-*/file-A' 
[cmd_test@btjeon-naver foo]$ ls
home  playground
[cmd_test@btjeon-naver foo]$ ll home/cmd_test/playground/dir-001
total 0
-rw------- 1 cmd_test cmd_test 0 May 28 17:26 file-A

--wildcards 옵션을 통해 dir-* 와일드카드를 포함하고 있는 경로명의 file-A 파일만을 해제한다.

 

[cmd_test@btjeon-naver ~]$ find playground -name 'file-A' -exec tar cf playground-fileA.tar '{}' '+'

find 명령어로 특정 파일만을 압축한다.

 

[cmd_test@btjeon-naver ~]$ find playground -name 'file-A' | tar czf playground-fileA.tgz -T -

z 옵션 : gzip 압축 아카이브 파일 생성

(-T, --files-from 옵션은 tar 프로그램이 커맨드라인이 아닌 파일에서 직접 경로명 목록을 읽어오도록 한다.)

[cmd_test@btjeon-naver ~]$ find playground -name 'file-A' | tar cjf playground-fileA.tbz -T -

j 옵션 : bzip2 압축 아카이브 파일 생성

 

ssh remote-sys 'tar cf - Documents' | tar xf -

파일 압축을 한 상태로 시스템 간 파일 전송을 할 수 있다. 아카이브 파일 생성 결과를 표준 출력으로 보냄.

 

[cmd_test@btjeon-naver ~]$ zip -r playground.zip playground
...
  adding: playground/dir-100/ (stored 0%)
  adding: playground/dir-100/file-A (stored 0%)
  adding: playground/dir-100/file-B (stored 0%)
  adding: playground/dir-100/file-C (stored 0%)
  adding: playground/dir-100/file-D (stored 0%)
  adding: playground/dir-100/file-E (stored 0%)...

[cmd_test@btjeon-naver ~]$ zip -r playground.zip playground
...
updating: playground/dir-100/ (stored 0%)
updating: playground/dir-100/file-A (stored 0%)
updating: playground/dir-100/file-B (stored 0%)
updating: playground/dir-100/file-C (stored 0%)
updating: playground/dir-100/file-D (stored 0%)
updating: playground/dir-100/file-E (stored 0%)
...
[cmd_test@btjeon-naver foo]$ unzip ../playground.zip 
Archive:  ../playground.zip
replace playground/dir-001/file-A? [y]es, [n]o, [A]ll, [N]one, [r]ename: A
...
 extracting: playground/dir-100/file-A  
 extracting: playground/dir-100/file-B  
 extracting: playground/dir-100/file-C  
 extracting: playground/dir-100/file-D  
 extracting: playground/dir-100/file-E
...

zip 명령어로 압축 및 압축 해제하기 (주로 윈도우 시스템과 파일을 교환하기 위해 사용)

기존 아카이브 파일이 존재할 때, 새로운 파일은 추가되고(adding) 중복된 파일은 교체된다(updating).

 

[cmd_test@btjeon-naver ~]$ unzip -l playground.zip playground/dir-077/file-Z
Archive:  playground.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  05-28-2022 17:26   playground/dir-077/file-Z
---------                     -------
        0                     1 file
[cmd_test@btjeon-naver ~]$ cd foo
[cmd_test@btjeon-naver foo]$ unzip ../playground.zip playground/dir-077/file-Z
Archive:  ../playground.zip
replace playground/dir-077/file-Z? [y]es, [n]o, [A]ll, [N]one, [r]ename: y
 extracting: playground/dir-077/file-Z

unzip 명령어는 일부 파일을 지정하여 해당 파일만 해제할 수 있다.

-l 옵션은 압축을 해제하지 않고 단지 아카이브이 내용만을 표시한다. -v 옵션을 통해 그 내용을 자세하게 볼 수 있다.

 

[cmd_test@btjeon-naver ~]$ find playground -name "file-A" | zip -@ playground-fileA.zip
...
  adding: playground/dir-095/file-A (stored 0%)
  adding: playground/dir-096/file-A (stored 0%)
  adding: playground/dir-097/file-A (stored 0%)
  adding: playground/dir-098/file-A (stored 0%)
  adding: playground/dir-099/file-A (stored 0%)
  adding: playground/dir-100/file-A (stored 0%)
[cmd_test@btjeon-naver ~]$ ls -l /etc | zip > foo.txt.zip
  adding: - (deflated 80%)
[cmd_test@btjeon-naver ~]$ unzip -p foo.txt.zip | less

zip 명령어도 tar처럼 표준 입출력을 활용할 수 있다. -@ 옵션으로 파일명들을 zip과 연결할 수 있다.

단, unzip 명령어는 표준 입력을 허용하지 않는다.

 

[cmd_test@btjeon-naver ~]$ rsync -av playground foo
...
playground/dir-100/file-V
playground/dir-100/file-W
playground/dir-100/file-X
playground/dir-100/file-Y
playground/dir-100/file-Z

sent 136,318 bytes  received 49,859 bytes  372,354.00 bytes/sec
total size is 0  speedup is 0.00
[cmd_test@btjeon-naver ~]$ rsync -av playground foo
sending incremental file list

sent 34,564 bytes  received 125 bytes  69,378.00 bytes/sec
total size is 0  speedup is 0.00
[cmd_test@btjeon-naver ~]$ touch playground/dir-099/file-Z
[cmd_test@btjeon-naver ~]$ rsync -av playground foo
sending incremental file list
playground/dir-099/file-Z

sent 34,618 bytes  received 150 bytes  69,536.00 bytes/sec
total size is 0  speedup is 0.00

rsync 명령어는 로컬 혹은 원격 파일 및 디렉토리를 동기화하는 기능을 제공한다.

변경된 파일만 감지하여 동기화를 수행한다.

 

sudo rsync -av --delete /etc /home /usr/local /media/BigDisk/backup

이와 같이 외부 저장 장치에 파일을 백업할 수 있다. --delete 옵션은 기존 시스템에는 더 이상 존재하지 않지만 백업 장치에는 남아 있을지도 모르는 파일에 대해 삭제하는 기능을 제공한다.

 

sudo rsync -av -delete --rsh=ssh /etc /home /usr/local remote-sys:/backup

이와 같이 원격 시스템에 백업 작업을 수행할 수도 있다.

 

 

 

 

 

 

출처 : 리눅스 커맨드라인 완벽 입문서

 

'IT일반 > Linux' 카테고리의 다른 글

Command Line - 텍스트 편집  (0) 2022.06.01
Command Line - 정규 표현식  (0) 2022.06.01
Command Line - 파일 검색  (0) 2022.05.28
Command Line - 네트워킹  (0) 2022.05.28
Command Line - 저장 장치  (0) 2022.05.27