--strip-comComponents -C는 tar에서 무엇을 의미합니까?

--strip-comComponents -C는 tar에서 무엇을 의미합니까?

다음 코드를 이해하고 있는지 확인하고 싶습니다.

tar xvzf FILE --exclude-from=exclude.me --strip-components 1 -C DESTINATION

에 게시됨이 답변.

에서 man tar:

--strip-components=NUMBER
추출 시 파일 이름에서 NUMBER개의 선행 구성 요소를 제거합니다.

-C, --directory=DIR
디렉토리 DIR로 전환

설명서의 설명을 이해하지 못했습니다 --strip-components.

에 관해서는 -C"제거된 구성 요소를 지정된 디렉터리에 넣습니다"라는 의미로 이해합니다.

무슨 뜻이에요 --strip-components -C?

답변1

귀하의 질문에 포함된 맨페이지 조각은 GNU tar's man에서 가져온 것입니다. GNU는 선호되는 소프트웨어 프로젝트입니다.정보매뉴얼은 맨페이지보다 낫습니다. 실제로 tar 맨페이지는2014년에 GNU tar 소스 트리에만 추가되었습니다. 이는 단지 참고용일 뿐, 예제가 포함된 완전한 매뉴얼은 아닙니다. info tar온라인으로도 제공되는 전체 정보 브로셔를 불러오실 수 있습니다 .여기. 여기에는 몇 가지 --strip-components사용 예가 포함되어 있으며 관련 스니펫은 다음과 같습니다.

--strip-components=number

추출하기 전에 파일 이름에서 지정된 개수의 선행 구성 요소를 제거합니다.

예를 들어 "archive.tar" 아카이브에 "some/file/name"이 포함되어 있으면 다음을 실행합니다.

tar --extract --file archive.tar --strip-components=2

이 파일은 "name" 파일에 추출됩니다.

그리고:

--strip-components=number

추출하기 전에 파일 이름에서 지정된 개수의 선행 구성 요소를 제거합니다.

예를 들어, 전체 "/usr" 계층을 "usr.tar"라는 tar 아카이브에 아카이브했다고 가정합니다. 다른 파일 중에서 이 아카이브에는 현재 작업 디렉토리에 추출하려는 "usr/include/stdlib.h"가 포함되어 있습니다. 이렇게 하려면 다음을 입력합니다.

$ tar -xf usr.tar --strip=2 usr/include/stdlib.h

"--strip=2" 옵션은 tar에게 파일 이름의 두 가지 주요 부분("usr/" 및 "include/")을 제거하도록 지시합니다.


즉 말하자면;

다음과 같은 tar의 다른 구현이 있습니다.FreeBSD tar 맨페이지이 명령은 다르게 해석됩니다.

--strip-components count

지정된 수의 선행 경로 요소를 제거합니다. 더 적은 수의 요소를 포함하는 경로 이름은 자동으로 건너뜁니다. 경로 이름은 포함/제외 패턴을 확인한 후 보안을 확인하기 전에 편집됩니다.

즉, Unix 경로는 로 구분된 일련의 요소로 이해해야 합니다 /( 하나만 있는 경우는 제외 /).

이것은 내 자신의 예입니다(다른 예는 위에 링크된 정보 책자에서 찾을 수 있습니다.)

새로운 디렉터리 구조를 만들어 보겠습니다.

mkdir -p a/b/c

경로는 , 및 의 a/b/c3개 요소로 구성됩니다 .abc

이 디렉터리에 빈 파일을 만들고 .tar 아카이브에 넣습니다.

$ touch a/b/c/FILE
$ tar -cf archive.tar a/b/c/FILE

FILE경로의 네 번째 요소입니다 a/b/c/FILE.

archive.tar의 내용을 나열하십시오.

$ tar tf archive.tar
a/b/c/FILE

--strip-components이제 .tar 파일을 추출할 때 제거할 경로 요소 수를 알려주는 매개변수를 사용하여 archive.tar를 추출할 수 있습니다 a/b/c/FILE. 원래 a디렉터리를 삭제합니다.

rm -r a

--strip-components=1a아직 재생성되지 않은 콘텐츠 만 추출합니다 .

$ tar xf archive.tar --strip-components=1
$ ls -Al
total 16
-rw-r--r-- 1 ja users 10240 Mar 26 15:41 archive.tar
drwxr-xr-x 3 ja users  4096 Mar 26 15:43 b
$ tree b
b
└── c
    └── FILE

1 directory, 1 file

보시 --strip-components=2다시피 a/b2개의 요소가 아직 다시 생성되지 않았습니다.

$ rm -r b
$ tar xf archive.tar --strip-components=2
$ ls -Al
total 16
-rw-r--r-- 1 ja users 10240 Mar 26 15:41 archive.tar
drwxr-xr-x 2 ja users  4096 Mar 26 15:46 c
$ tree c
c
└── FILE

0 directories, 1 file

아직 다시 생성되지 않은 --strip-components=33가지 요소가 있으며 실행 중인 동일한 레벨 디렉터리 에 있습니다 .a/b/cFILEtar

$ rm -r c
$ tar xf archive.tar --strip-components=3
$ ls -Al
total 12
-rw-r--r-- 1 ja users     0 Mar 26 15:39 FILE
-rw-r--r-- 1 ja users 10240 Mar 26 15:41 archive.tar

-C이 옵션은 요청된 작업을 실행하기 전에 tar에게 지정된 디렉터리로 변경하고 추출하고 보관하도록 지시합니다. 존재하다이 댓글 물어:

tar를 CD에 요청하기: 왜 CD를 사용합니까? 묻고 싶습니다. 왜 그냥 MV가 아닌가요?

mv왜 이것이 더 낫다고 생각합니까 ? 먼저 tar 아카이브를 어느 디렉토리에 추출하시겠습니까?

  • /tmp - 누락되었거나 가득 차면 어떻게 되나요?

  • "$TMPDIR" - 설정되지 않았거나 누락되었거나 가득 차면 어떻게 되나요?

  • 현재 디렉터리 - 사용자에게 w권한이 없고 및 만 있으면 r어떻게 됩니까 x?

  • 임시 디렉터리(그것이 무엇이든)에 이미 아카이브에 있는 것과 동일한 이름을 가진 파일이 포함되어 있고 tar추출하면 해당 파일을 덮어쓰는 경우 어떻게 됩니까?

  • 임시 디렉토리(그것이 무엇이든)가 Unix 파일 시스템을 지원하지 않고 소유권, 실행 가능 비트 등에 대한 모든 정보가 손실되면 어떻게 됩니까?

또한 이는 다른 프로그램에서도 -C공통적으로 사용되는 옵션 입니다.change directory자식그리고 만들다내 마음에 가장 먼저 떠오른 것은.

답변2

--strip-components옵션은 추출된 파일의 파일 이름을 수정하는 데 사용됩니다. --strip-components <N>"파일 이름의 첫 번째 구성 요소 제거"를 의미합니다 . <N>여기서 "구성 요소"는 ./

파일 이름이 있는 경우 추출된 파일의 이름을 따서 이름이 지정 foo/bar/baz됩니다 .--strip-components 1bar/baz


-C옵션은 단순히 "디렉토리 변경"을 의미합니다. 를 사용하는 경우 -C /some/other/place실제로 파일을 추출하기 전에 묻는 메시지가 나타납니다 tar. cd /some/other/place이는 일반적으로 파일이 /some/other/place.

답변3

좋은 답변에 추가하려면라스케스-C, 이 옵션과 관련된 혼란을 해결하기 위해 다음을 수행하세요 .

매뉴얼 tar페이지에는 이 옵션이 나와 있습니다 -C.

-C, --directory=DIR
              Change  to DIR before performing any operations.  This option is
              order-sensitive, i.e. it affects all options that follow.

따라서 mv실제로는 tar다른 작업 디렉토리로 변경하라는 내용이 아닙니다. 또한 순서가 중요하다는 점에 유의하세요. 그래서:

tar r -f archive.tar -C /path file1 file2

파일 과 위치를 추가합니다 file1.file2/patharchive.tar

tar r -f archive.tar file1 file2 -C /path file3 file4

현재 작업 디렉토리에서 추가된 file1다음 해당 위치에서 추가됩니다.file2file3file4/path

--strip-components-C독립적이고 관련 없는 옵션 입니다 tar. 첫 번째는 압축을 푼 후 아카이브의 폴더 구조에 영향을 미치며 -C아카이브 외부의 파일을 지정하기 위한 작업 디렉터리를 지정합니다.tar

답변4

다른 답변에서 다루지 않은 설명으로 무엇을 말할 수 있는지 잘 모르겠습니다. 대신에 예시를 들어 도움을 드리겠습니다.

Arkadiusz Drabczyk가 예를 들었습니다.~에서GNU tar 매뉴얼 아카이브에 대규모 디렉토리 트리(예: all  /usr)가 포함되어 있는 경우:

$ tar -cf usr.tar  /usr

그리고 아카이브를 드릴다운하여 하위 수준 하위 디렉터리에서 파일을 추출하려고 합니다.

$ tar -xf usr.tar --strip=2 usr/include/stdlib.h

설명서에 나와 있지 않은 것은 다음과 같습니다.

$ tar -xf usr.tar           usr/include/stdlib.h

그런 다음 현재 디렉터리 아래에 디렉터리를 만들고  tar그 안에 하위 디렉터리를 만듭니다 . 원하는 경우 해당 명령을 사용하면 됩니다. 그러나 현재 디렉토리에 있으려면 다음이 필요합니다.usrincludeusrstdlib.h./usr/includestdlib.h

$ mv usr/include/stdlib.h .

그럼 어쩌면 rmdir -p usr/include… 이것은 효과가 있지만 지루합니다.  --strip=2타이핑 시간을 많이 절약해 보세요.


-Cc(소문자 C) 옵션(Create Archive)과 함께 사용할 수도 있으며 이는 이해하기 더 쉽습니다. John, Kate, Larry 및 Mary가 공동으로 책을 집필하고 있다고 가정해 보겠습니다. 그들은 각각 1장, 2장, 3장, 4장을 쓰고 있습니다. John과 Kate는 (오직) 동일한 컴퓨터를 사용하며 지금까지 수행한 작업을 보관하고 다른 저자들에게 보내고 싶어합니다. 다음 중 하나를 수행할 수 있습니다.

  (CD적절한 디렉토리로)
$ tar cf chap12.tar /home/john/chap1 /home/kate/chap2
또는

$ cd /home
$ tar cf /tmp/chap12.tar john/chap1 kate/chap2

그러나 이것들은 코드화된 john/아카이브를 생성합니다 kate/이렇게 하면 Larry와 Mary가 사용하거나 추출하는 아카이브가 --strip=2됩니다  --strip=1.  당신을 괴롭히는 사람들을 저장하고 싶거나(및/또는 개인정보 보호 등의 이유로 당신의 이름을 아카이브에서 제외하고 싶다면) 다음을 수행할 수 있습니다.

  (CD적절한 디렉토리로)
$ tar cf chap12.tar -C /home/john chap1 -C /home/kate chap2

그러면 아카이브에는 chap1chap2디렉토리만 표시됩니다.

관련 정보