tar : 멤버 이름에서 선행`/ '제거


137
root@server # tar fcz bkup.tar.gz /home/foo/
tar: Removing leading `/' from member names

이 문제를 어떻게 해결 /하고 파일 이름을 유지할 수 있습니까?


2
정확히 예상대로 작동하지 않는 것은 무엇입니까?

34
문제가되지 않습니다. 당신은 원하지 않는 타르 아카이브에서 선도적 인 슬래시. 진심으로. 아카이브를 시스템 루트로 추출하려면 압축을 풀 -C /때 지정 하십시오.
ThiefMaster

답변:


69

사용 --absolute-names하거나 -P이 기능을 비활성화하는 옵션을 선택합니다.

tar fczP bkup.tar.gz /home/foo/

tar fcz bkup.tar.gz --absolute-names /home/foo

54
이것은 정답이지만 대부분의 경우 이것이 원하는 것이 아니므 로 완전한 경로로 추출하는 아카이브가됩니다.
rubo77

8
-C /@Marcus의 답변에 설명 된 옵션을 사용하면 기본 목표 인 경우 STDERR 메시지가 사라집니다.
Matt Sanders

1
@ rubo77이 언급했듯이 일반적으로 이것은 명령의 예상 결과가 아닙니다.
alfredocambera

3
대부분의 경우 이것은 사용자가 원하는 것이 아닙니다. 단순히 대부분의 사용자가 필요할 때까지 매뉴얼을 읽지 않기 때문입니다 (아무도 그럴 시간이 없습니다). 따라서, 사람들이 자신의 결과가 어떤 영향을 미치는지에 대해 절대적으로 확신하지 않는 한, 사람들이 이것을하지 말라고 경고하면서 적어도 당신의 대답을 넓히는 것이 현명 할 것입니다. 특히 답변으로 받아 들여지고 있습니다.
Mladen B.

1
@Toskan 예제 추가됨
Barmar

89

실제로는 문제가 아니라 기능입니다. 절대 위치가있는 아카이브는 보안 위험이 있습니다. 공격자는 이러한 아카이브를 사용하여 중요한 시스템 위치에 파일을 설치하도록 사용자를 속일 수 있습니다.

예, 사용할 수 있습니다 -P. 그러나 tar가 슬래시를 제거하고 아카이브 사용자가 루트 디렉토리에서 추출을 명시 적으로 수행하도록 요구하면 무엇이 문제입니까? 그런 다음 그들은 의식적으로 중요한 시스템 위치에 영향을 미치며 우연히 그렇게 할 수 없습니다.


5
때로는 기능에 문제가 있습니다. 에서 0이 아닌 종료 상태로 이메일을 보내는 백업 스크립트를 설정 한 후이 스레드를 찾았습니다 tar. 이 특정 메시지는 tar상태 인으로 종료 1되었습니다 tar.이 메시지는 STDERR에이 메시지를 쓰고 있었기 때문에 성공적인 백업에 대해 잘못된 이메일 경고를 수신하게했습니다 . 나는 나만의 수정 된 cd /path/to/network/share && tar -cJf scripts.backup.tar.xz -C / home/user/scripts 2>/dev/null || [send an email alert]
@Marcus

1
-P예를 들어 FUSE에서 일종의 파일 시스템 스냅 샷 기능을 제공하는 경우와 같은 사용 사례가 있다고 생각 합니다. 때때로 cwd사용자 관점이 아닌 특정 디렉토리에서 스냅 샷을 언 타르 팅하고 싶을 수도 있습니다 .
DIMMSum

81

당신이 제거하려면 "최고의 제거`/ '멤버 이름에서"STDERR에 인쇄 된,하지만 여전히 타르 현명 기본적으로처럼 그 선도적 인 슬래시를 떠나고 싶어하고, 나는 훌륭한 솔루션을보고 여기에 주석의 timsoft으로합니다.

해결책은 -C 옵션을 사용하여 디렉토리를 루트 (/)로 변경 한 다음 슬래시 없이 아카이브 할 파일 트리를 지정하는 것입니다. 이제 상대 경로 만 있으면됩니다. 이것은 일반적인 tar create 명령과 같은 작업을 수행하지만 스트리핑이 필요하지 않습니다.

tar fcz bkup.tar.gz -C / home/foo/

증분 백업에서는 작동하지 않습니다. 그러나 좋은 대답입니다.
gajdipajti

tar c -C / home/foo/*쉘이 변경된 루트에 대해 알지 못하므로 쉘 확장으로 표시된 파일을 tar하려는 경우에도 작동하지 않습니다 (예 :). 그러나 다른 경우에는 여전히 좋은 대답입니다.
보리스

1
-C /나를 위해 작동하지 않습니다. 그것은 나를 위해 stderr을 막지 않습니다.
Acumenus

3
@ABB는 -C / 다음에 오는 경로가 상대적인지 확인하십시오.
zurfyx

사용자에게 루트 디렉토리에 대한 권한이없는 경우이 방법이 작동합니까?
Mladen B.

31

한 달 늦었지만 쉘 스크립트에서 내 경우에 가장 적합한 해결책은 부모 디렉토리로 이동하여 명령을 실행하는 것입니다.

cd /var/www/
tar -czf mysite.gz mysite

대신에:

tar -czf /var/www/mysite.gz /var/www/mysite

9
실제로 다음을 사용하여 수행 할 수 있습니다. tar -zcvf mysite.gz -C / var / www / mysite / 이것의 장점은 모든 디렉토리에서 실행할 수 있다는 것입니다.
alfredocambera

도와 주셔서 감사합니다. 이것이 내가 필요한 것입니다. tarball의 전체 경로를 원하지 않고 대상 폴더 만 원했습니다.
Christia

이것은 아마도 정답으로 받아 들여졌을 것입니다.
Mladen B.

이것이 어떻게 질문에 대답하는지 모르겠습니다. 할 수있는 다른 것입니다. ……… 좋아요 : Q : 로스 앤젤레스에서 뉴욕으로 어떻게 가나 요? A : 대신 샌프란시스코로 가십시오.
G-Man

@ G-Man에 동의합니다. 이로 인해 완전히 다른 디렉토리 구조를 가진 tar 파일이 생성됩니다. 어떤 경우에는, 그 디렉토리 구조가 실제로 처음에 더 적절하지만 질문에 대답하지 않습니다.
Kevin Keane

7

이것이 무차별 강제 방법을 사용하여 수행 한 방법 2>&1 | grep -v "Removing leading"입니다.

예를 들면 다음과 같습니다.

tar -cf "$BKUPDIR/${BKUPFILE}.tar" --overwrite --exclude '.*' --one-file-system "$SRCDIR" 2>&1 | grep -v  "Removing leading"

4
이것의 문제는 오류 코드를 숨기는 것입니다. 따라서 bash 스크립트에서 tar의 오류 코드를 확인하려는 경우 성공하면 0을 반환하지 않습니다.
Brian

@staticx, 오류 코드는 0입니다.
Acumenus

1
@ABB tar명령이 2치명적인 오류로 반환 될 수 있습니다 .
Jite

1
@Brian $ PIPESTATUS를 사용하여 종료 코드를 얻을 수 있습니다. 참조 unix.stackexchange.com/questions/14270/...
simpleuser

3

-C완전한 경로 를 사용 하여 압축하지 못하는 경로에만 사용하십시오 .

root@server # tar fcz bkup.tar.gz -C /home/ foo/

2

이 문제를 다음과 같이 해결했습니다.

cd /home/foo && tar czf ~/backup.tar.gz .

그렇게하면 먼저 tar 아카이브에 절대 경로를 넣으려고하지 않습니다. 파일 시스템의 루트에서 압축을 풀려면

cd / && tar xzf backupt.tar.gz 전송 후.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.