tar에는 다양한 옵션과 매개변수가 있습니다! 일반적으로 사용되는 몇 가지 옵션만 다루겠습니다.
[root@www ~]# tar [-j|-z] [cv] [-f로 만든 파일 이름] filename... <==패키징 및 압축
[root@www ~]# tar [-j|-z] [tv] [-f로 생성된 파일 이름] <==파일 이름 보기
[root@www ~]# tar [-j|-z] [xv] [-f 파일 이름 생성됨] [-C 디렉터리] <==압축 풀기
옵션 및 매개변수:
-c: 패키지된 파일을 생성합니다. 이 파일은 -v와 함께 사용하여 패키지되는 파일 이름을 볼 수 있습니다. 프로세스( 파일 이름)
-t: "파일 이름"을 중심으로 패키지된 파일의 내용에 어떤 파일 이름이 포함되어 있는지 확인합니다.
-x: 압축 풀기 또는 압축 풀기 기능, -C와 함께 사용할 수 있습니다. (대문자) 특정 디렉터리 잠금 해제
-c, -t, -x는 일련의 명령줄에 동시에 나타날 수 없다는 점에 유의하는 것이 중요합니다.
-j: bzip2 지원을 통한 압축/압축 풀기: 파일 이름은 *.tar.bz2를 사용하는 것이 좋습니다.
-z: gzip 지원을 통한 압축/압축 풀기: 이때 파일 이름은 *.tar를 사용하는 것이 가장 좋습니다. .gz
-v : 압축/압축 풀기 과정에서 처리 중인 파일명이 표시됩니다!
-f 파일 이름: -f 바로 뒤에는 처리할 파일 이름이 와야 합니다! 별도의 옵션 -f를 작성하는 것이 좋습니다!
-C 디렉터리: 압축을 풀 때 사용하는 옵션입니다. 특정 디렉터리에 압축을 풀고 싶다면 이 옵션을 사용하면 됩니다.
후속 연습에서 사용할 다른 옵션 소개:
-p: 백업 데이터의 원래 권한과 속성을 유지하며 중요한 구성 파일을 백업(-c)하는 데 자주 사용됩니다.
-P: 절대 경로를 유지합니다. 즉, 백업 데이터에 루트 디렉터리의 존재가 포함될 수 있음을 의미합니다.
--exclude=FILE: 압축 프로세스 중에 FILE을 패키지하지 마세요!
사실 tar를 사용하는 가장 쉬운 방법은 다음 방법을 기억하는 것입니다.
압축: tar -jcv -f filename.tar.bz2 압축 또는 디렉터리 이름 쿼리: tar -jtv -f filename.tar.bz2 압축 풀기: tar -jxv -f filename.tar.bz2 -C 압축을 풀 디렉터리의 filename.tar.bz2는 우리가 직접 선택한 파일 이름이며, tar 생성된 파일명은 자동으로 생성되지 않습니다! 우리는 그것을 맞춤 설정할 것입니다! 그래서 확장이 매우 중요합니다! [-j|-z]를 추가하지 않은 경우 파일 이름은 *.tar가 가장 좋습니다. -j 옵션인 경우 bzip2 지원이 있음을 의미하므로 파일 이름은 *.tar.bz2가 가장 좋습니다. bzip2는 .bz2 확장자를 생성하기 때문입니다! -z가 추가된 gzip 지원의 경우 파일 이름은 *.tar.gz가 가장 좋습니다! 이해했나요?
그리고 "-f 파일명"이 촘촘히 이어지기 때문에 과거의 많은 기사에서는 "-jcvf 파일명"을 자주 썼는데 이는 맞지만 옵션의 순서는 이론적으로 바뀔 수 있기 때문에 많은 독자들이 "-jvfc filename"도 사용할 수 있다고 잘못 생각하게 됩니다. 실제로 이렇게 하면 생성된 파일 이름이 c! -fc 때문에! 따라서 tar를 학습할 때 "-f filename"을 다른 옵션과 분리하여 문제가 발생할 가능성을 줄이는 것이 좋습니다.
더 이상 고민하지 말고 일반적으로 사용되는 tar 방법을 테스트해 보겠습니다!
tar를 사용하여 -j 또는 -z 매개변수를 추가하여 /etc/ 디렉터리를 백업하세요.
무슨 일이 생기면 /etc 디렉터리를 백업해 두는 것이 좋습니다! /etc를 백업하는 가장 쉬운 방법은 tar를 사용하는 것입니다! 먼저 살펴보겠습니다.
[root@www ~]# tar -zpcv -f /root/etc.tar.gz /etc
tar: 멤버 이름에서 선행 `/' 제거 < 이 경고 메시지에 주의하세요
/etc/
....가운데는 생략하세요....
/etc/esd.conf
/etc/crontab
# 추가로 인해 of -v 이 옵션을 사용하면 활성 파일 이름이 화면에 표시됩니다.
# 첫 페이지로 넘어가면 위와 같은 에러 메시지가 나옵니다! 아래에서 설명하겠습니다.
# -p 옵션은 "원본 파일의 권한과 속성을 보존하는 것"에 중점을 둡니다.
[root@www ~]# tar -jpcv -f /root/etc.tar.bz2 /etc
# 표시되는 정보는 위와 동일합니다!
[root@www ~]# ll /root/etc*
-rw-r--r-- 1 루트 루트 8740252 11월 15일 23:07 /root/etc.tar.bz2
-rw-r--r-- 1 루트 루트 13010999 Nov 15 23:01 /root/etc.tar.gz
[root@www ~]# du -sm /etc
118 /etc
# -j 옵션을 사용하는 것이 권장되는 이유는 무엇입니까? 위의 값으로 알 수 있나요? ^_^
위의 연습을 통해 bzip2, 즉 -j 옵션을 사용하여 백업할 때 더 나은 압축률을 얻을 수 있다는 것을 알 수 있습니다! 위 표에서 볼 수 있듯이 원래 /etc/(118MBytes)는 약 8.7Mbytes로 떨어졌습니다! "-p" 옵션을 추가하는 이유는 원본 파일의 권한과 속성을 보존하기 위함입니다! 7장의 cp 명령 소개에서 복사에 대한 권한과 파일 유형(예: 링크 파일)의 다양한 효과에 대해 이야기했습니다. 마찬가지로 중요한 시스템 데이터를 백업할 때 이러한 원본 파일의 권한을 완전히 백업하는 것이 좋습니다. 여기서 -p 옵션이 유용합니다. 다음으로, 패키징된 파일에는 어떤 데이터가 있는지 살펴볼까요?
tar 파일의 데이터 내용을 확인하고(파일명도 확인 가능), 백업 파일명이 루트 디렉터리의 의미를 가지고 있는지 확인하세요
파일을 확인하는 방법은 매우 간단합니다 이름! 이렇게 할 수 있습니다:
[root@www ~]# tar -jtv -f /root/etc.tar.bz2
....앞부분 생략....
-rw-r--r-- root / 루트 1016 2008-05-25 14:06:20 etc/dbus-1/session.conf
-rw-r--r-- 루트/루트 153 2007-01-07 19:20:54 etc/ esd .conf
-rw-r--r-- root/root 255 2007-01-06 21:13:33 etc/crontab
-v 옵션을 추가하면 세부 정보 파일 권한/속성이 나열됩니다! 파일 이름만 알고 싶다면 -v를 제거하면 됩니다. 위의 데이터에서 우리는 매우 흥미로운 사실을 발견할 수 있습니다. 즉, 각 파일 이름에는 루트 디렉터리가 없다는 것입니다! 이전 연습문제에서 나왔던 "tar: 멤버 이름 앞의 /' 제거(파일 이름 앞부분의 /' 제거)"라는 경고 메시지도 마찬가지입니다!
그렇다면 왜 루트디렉토리를 제거해야 할까요? 주로 안전을 위해! tar를 사용하여 백업한 데이터는 압축을 풀어야 사용할 수 있습니다. tar에 기록된 파일 이름(방금 tar -jtvf를 사용하여 관찰한 파일 이름)은 압축을 푼 후의 실제 파일 이름입니다. 루트 디렉터리가 제거되면 /tmp에 있는 백업 데이터의 압축을 푼다고 가정하면 압축이 풀린 파일 이름은 "/tmp/etc/xxx"가 됩니다. 그러나 "루트 디렉토리가 제거되지 않으면 압축이 풀린 파일 이름은 절대 경로가 됩니다. 즉, 압축이 풀린 데이터는 확실히 /etc/xxx에 배치됩니다!" '이렇게 하면 백업 데이터가 /etc/에 있는 원본 데이터를 덮어쓰게 됩니다! 팁: "백업 데이터이기 때문에 다시 복원하는 데 문제가 없지 않습니까?"라고 말할 것입니다. '백업한 데이터가 CentOS 4 이전 버전인 상황을 상상해 보세요. 5.x 이하의 /etc가 이전 버전의 백업 데이터로 덮어쓰기 됩니다! 이 시점에서 무엇을 해야 합니까? 따라서 물론 루트 디렉터리를 제거하는 것이 더 안전합니다. 루트 디렉터리를 tar 파일에 백업해야 한다고 확신하는 경우 -P(대문자) 옵션을 사용할 수 있습니다. 아래 분석 예를 참조하십시오. 예: 파일 이름에 (루트) 디렉터리를 백업하고 check 백업파일의 내용파일명을 확인하세요
[root@www ~]# tar -jpPcv -f /root/etc.and.root.tar.bz2 /etc
.... 중간 프로세스는 생략됩니다...
[root@www ~]# tar -jtf /root/etc.and.root.tar.bz2
/etc/dbus-1/session.conf
/ etc/esd.conf
/etc/crontab
# 이번에 확인한 파일 이름에는 -v 옵션이 포함되어 있지 않아 그냥 파일 이름입니다! 자세한 속성/권한 및 기타 매개변수는 없습니다.
뭔가 다른 점을 느끼셨나요? -P 옵션을 추가하면 파일명에 루트 디렉터리가 존재하게 됩니다! 그러나 Brother Bird의 개인적인 제안은 백업에 -P 옵션을 추가하지 않는 것입니다! 결국 우리는 향후 문제를 추적하기 위해 백업하는 경우가 많으며 반드시 원래 시스템으로 다시 복원할 필요는 없습니다! 따라서 루트 디렉터리를 제거한 후에는 백업 데이터 적용이 더욱 유연해집니다! 더 안전하기도 해요!
백업된 데이터를 추출하고 특정 디렉터리에 대한 압축해제 동작을 고려합니다(-C 옵션 적용)
압축을 풀고 싶다면? 아주 간단한 조치는 직접 포장을 푸는 것입니다!
[root@www ~]# tar -jxv -f /root/etc.tar.bz2
[root@www ~]# ll
....(이전 생략).. ..
drwxr-xr-x 105 root root 12288 Nov 11 04:02 etc
....(나중에 생략)....
이때 포장은 파일은 "이 디렉토리에 압축 해제" 작업을 수행합니다! 그러면 잠시 후 홈 디렉토리 아래에 etc라는 디렉토리가 있을 것입니다! 따라서 /tmp 아래에 파일의 압축을 풀고 싶다면 cd /tmp 를 한 후 위의 명령을 실행하면 됩니다. 그런데 이게 참 귀찮은 것 같네요~ "잠금 해제할 디렉터리를 지정"하는 더 쉬운 방법이 있을까요? 예, -C 옵션을 사용할 수 있습니다! 예:
[root@www ~]# tar -jxv -f /root/etc.tar.bz2 -C /tmp
[root@www ~]# ll /tmp
. ...(첫번째 생략)....
drwxr-xr-x 105 root root 12288 Nov 11 04:02 etc
....(두번째 생략)....
이렇게 하면 다른 디렉터리에 압축을 풀 수 있습니다! Niao 형제는 개인적으로 이 -C 옵션을 기억해야 한다고 믿습니다! 좋습니다. 처리 후에는 이 두 디렉터리를 삭제하는 것을 잊지 마세요!
[root@www ~]# rm -rf /root/etc /tmp/etc
다시 한번 말씀드리지만, 이 "rm -rf"는 매우 위험한 명령입니다! 다운로드 시 반드시 뒤에 나오는 파일명을 확인하시기 바랍니다. 삭제하려는 항목은 /root/etc 및 /tmp/etc입니다. /etc/를 삭제하지 마세요! 시스템이 죽습니다~ ^_^
단일 파일만 압축해제하는 방법
지금 압축을 풀면 패키지 파일 전체의 내용을 다 풀었습니다! 상황을 상상해 보세요. 패키지 파일에 있는 파일 중 하나만 압축을 풀고 싶다면 어떻게 해야 합니까? 매우 간단합니다. -jtv를 사용하여 원하는 파일 이름을 찾은 다음 파일 이름의 압축을 풀면 됩니다. 다음 예를 사용하여 설명하겠습니다.
# 1. 먼저 섀도우 파일의 압축이 풀렸다고 가정하고 원하는 파일 이름을 찾습니다.
[root@www ~]# tar -jtv -f /root/etc.tar.bz2 |
-r--------- 루트/루트 1230 2008-09-29 02:21:20 etc/shadow-
-r--------- 루트/루트 622 2008- 09-29 02:21:20 etc/gshadow-
-r--------- 루트/루트 636 2008-09-29 02:21:25 etc/gshadow
-r--- ----- root/root 1257 2008-09-29 02:21:25 etc/shadow <==이것이 우리가 원하는 것입니다!
# 중요한 파일명을 먼저 검색해보세요! 그 중 grep은 "검색" 키워드의 기능입니다! 세 번째 글에서 설명드리겠습니다!
# 여기서 아이디어만 있으면 됩니다! 해당 파이프라인 | grep과 함께 사용하여 키워드의 의미를 추출합니다!
# 2. 파일의 압축을 풀어주세요! 구문 및 실제 사용법은 다음과 같습니다.
[root@www ~]# tar -jxv -f packaged file.tar.bz2 압축을 풀 파일 이름
[root@www ~]# tar -jxv -f /root/ etc.tar.bz2 etc/shadow
etc/shadow
[root@www ~]# ll etc
총 8개
-r--------- 루트 루트 1개 1257 9월 29일 02:21 그림자 <==야 마셔라! 파일은 하나뿐입니다!
# 매우 흥미롭습니다! 이번에는 하나의 파일만 잠금 해제됩니다! 하지만 중요한 점은 파일명입니다! 올바른 파일 이름을 찾아야 합니다.
# 이 경우 /etc/shadow 를 쓸 수 없습니다! etc.tar.bz2에 기록된 파일명 때문! <… /root/etc*로 시작합니다. 왜냐하면 이 파일들은 모두 방금 생성한 백업 파일이기 때문입니다! 그리고 이 새로운 패키징 파일이 /root/system.tar.bz2로 배치된다고 가정하면 물론 이 파일은 자체적으로 패키징되어서는 안 됩니다(이 파일은 /root! 아래에 배치되기 때문입니다). --exclude의 도움! 제외한다는 것은 포함하지 않는다는 뜻입니다! 따라서 이렇게 할 수 있습니다:
> /root/system.tar.bz2 /etc /root
위 명령은 전체 목록입니다~ 실제로는 다음과 같이 입력해도 됩니다. 『tar -jcv -f /root/system.tar.bz2 - -exclude=/root/etc* --exclude=/root/system.tar.bz2 /etc /root』, 두 줄을 입력하려면 끝에 백슬래시()를 추가하고 즉시 [enter]를 누르십시오. 두 번째 줄로 이동하여 계속 입력할 수 있습니다. 이 명령을 내리는 방법은 3장에서 자세히 설명하겠습니다. 이 --exclude="file" 작업을 통해 패키징 목록에서 여러 특수 파일이나 디렉터리를 제거할 수 있으므로 패키징 작업이 더 쉬워집니다! ^_^
또한 tar 명령의 새 버전에서 Brother Bird는 원래 "--exclude 파일"이 실제로 실행되지 않는 것 같다는 사실을 발견했습니다! 이 옵션은 man tar를 사용할 때 확실히 보였는데, info tar를 사용해보니 옵션 기능이 "--exclude=file" 모드로 변경된 것을 발견했습니다! 이곳은 특히 주의하셔야 해요!
[root@www ~]# find /etc -newer /etc/passwd
.... ( 과정 생략)....# 이때 /etc/passwd 파일의 mtime보다 최신의 파일명이 표시됩니다.
# 이 결과는 호스트마다 다릅니다! 자신의 호스트를 먼저 확인하면 Brother Bird처럼 되지 않을 것입니다!
[root@www ~]# ll /etc/passwd
-rw-r--r-- 1 루트 루트 1945 9월 29일 02:21 /etc/passwd
# 2. 좋아요, 그럼 tar를 사용해 패키징하세요! 날짜는 위와 같이 2008/09/29입니다
[root@www ~]# tar -jcv -f /root/etc.newer.then.passwd.tar.bz2
> ="2008/09/29" /etc/*
....(중간생략)....
/etc/smartd.conf <==백업파일이 정말 있습니다
. ...(중간 생략)....
/etc/yum.repos.d/ <==디렉토리가 모두 기록됩니다!
tar: /etc/yum.repos.d/CentOS-Base.repo: 파일이 변경되지 않았습니다. 덤프되지 않았습니다
# 마지막 줄에 "백업되지 않음"이 표시됩니다. 이는 덤프되지 않음을 의미합니다!
# 3. 파일 표시
[root@www ~]# tar -jtv -f /root/etc.newer.then.passwd.tar.bz2
> '/$'
# 이 명령을 통해 tar.bz2에서 /로 끝나지 않는 파일 이름을 불러올 수 있습니다! 그것이 우리가 원하는 것입니다!
이제 이 명령이 얼마나 유용한지 알게 되셨습니다! 차등파일까지 녹화하고 백업할 수 있어요~ 이렇게 백업하면 훨씬 편해집니다! 한 달 전에만 전체 데이터 백업을 했다면, 이번 달에 백업하고 싶을 때는 당연히 지난달에 백업한 시점 이후에 업그레이드된 파일들만 백업하면 되겠죠! 왜? 원본파일은 백업해놨으니까! 왜 또 하는 걸까요? 새로운 데이터를 백업하면 됩니다. 백업 용량이 줄어들 수 있습니다!
기본 이름: tarfile, tarball?
tar로 패키지된 파일은 압축 여부에 관계없이 이름이 다르다는 점도 언급할 가치가 있습니다! 단지 패키징용이라면 그냥 "tar -cv -f file.tar"입니다. 우리는 이 파일을 tarfile이라고 부릅니다. "tar -jcv -f file.tar.bz2"와 같은 압축 지원이 있는 경우 이를 tarball(tar ball?)이라고 부릅니다! 이것은 단지 기본적인 제목일 뿐이지만 많은 책과 인터넷에서 이 타르볼의 이름을 사용하게 될 것입니다! 그래서 소개해드려야 겠습니다.
또한 tar는 데이터를 파일로 패키징할 수 있을 뿐만 아니라 파일을 특정 특수 장치로 패키징할 수도 있습니다. 예를 들어 테이프 드라이브(tape)가 일반적인 예입니다. 테이프 드라이브는 일회성 읽기/쓰기 장치이므로 cp와 같은 명령을 사용하여 복사할 수 없습니다! 그런 다음 /home, /root, /etc를 테이프 드라이브(/dev/st0)에 백업하려면 "tar -cv -f /dev/st0 /home /root /etc"를 사용할 수 있습니다. 아주 간단하고 쉬운 바! 백업(특히 엔터프라이즈 애플리케이션)에 테이프 드라이브를 사용하는 것은 매우 일반적입니다!
특수 응용 프로그램: 파이프라인 명령 및 데이터 흐름 사용
tar를 사용할 때 가장 특별한 방법 중 하나가 있습니다. 즉, 표준 입력 및 출력 데이터 흐름 리디렉션(표준 입력)을 통한 것입니다. /표준 출력) 및 파이프라인 명령(파이프) 방식을 통해 처리할 파일을 패키지화하여 대상 디렉터리에 압축을 푼다. 데이터 흐름 리디렉션 및 파이프라인 명령에 대한 자세한 데이터는 11장 bash에서 먼저 소개하겠습니다.
# 1. /etc 디렉토리 전체를 압축하고 /tmp에 압축을 푼다
[root@www ~]# cd /tmp
[root@www tmp]# tar -cvf - / etc | tar -xvf -
# 이 작업은 cp -r /etc /tmp~와 약간 비슷합니다. 여전히 용도가 있습니다!
# 주목해야 할 점은 출력 파일도 -가 되고, 입력 파일도 -가 되고, 또 있다는 점입니다~
# 이들은 각각 표준 출력, 표준 입력 및 파이프라인 명령을 나타냅니다!
# 쉽게 말하면 - 메모리상의 장치(버퍼)라고 생각하면 됩니다.
# 더 자세한 데이터 흐름과 파이프라인 명령을 보려면 bash 장을 참조하세요!
위의 예에서는 "/etc 아래의 데이터를 /tmp 아래의 현재 경로에 직접 복사"하고 싶지만 cp -r을 사용하는 것이 약간 번거롭다고 느낍니다. 그럼 이렇게 패키징하면 됩니다. 명령에서 -는 패키징된 파일을 의미합니다! 중간 파일이 존재하는 것을 원하지 않기 때문에 이 방법을 사용하여 복사합니다!
위 내용은 노트004 리눅스에서 흔히 사용되는 tar 명령어의 내용입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!