"./"로 시작하는 .tar 콘텐츠를 사용하지 마세요.

"./"로 시작하는 .tar 콘텐츠를 사용하지 마세요.

tar 및 xz를 사용하여 디렉토리를 백업하려고 하는데 문제가 있습니다. 파일을 열면 모든 파일과 디렉터리가 ./.로 시작됩니다. 그런 일이 발생하는 것을 원하지 않습니다.

file.tar.xz
    |---- ./directory
        |---- ./file1.txt
    |---- ./file2.txt        
    |---- ./file3.txt

이것은 내가 사용하는 코드입니다:

tar -cf - -C $dir --absolute-names . | xz -c > $output/$name.$date.txz

이를 방지하려면 무엇을 변경해야 합니까?

답변1

이름에 특수 문자가 포함된 하위 수준 파일이나 디렉터리를 처리하지 않아도 되는 경우 $dir:

tar -cf - -C "$dir" --absolute-names $(ls -A "$dir") | xz -c > "$output/$name.$date.txz"

그러면 콘텐츠가 나열 $dir되고 tar콘텐츠를 보관하라는 메시지가 표시됩니다. 대신 .콘텐츠가 $dir아카이브의 루트에 표시됩니다.

/루트 경로에서 시작 하지 않으므로 GNU 관련 특정 항목이 필요하지 않습니다 --absolute-names.

tar -cf - -C "$dir" $(ls -A "$dir") | xz -c > "$output/$name.$date.txz"

답변2

사용 pax(보관용 POSIX 명령):

(cd -P -- "$dir" && pax -w's|^\./||' .) | xz > file.tar.xz

그러나 GNU와 마찬가지로 tar교체 --transforms|^\./||심볼릭 링크 대상에서도 작동하므로 foo -> ./bar현재 디렉터리에 심볼릭 링크가 있으면 foo -> bar.

GNU를 사용할 때 tar플래그를 전달하면 이를 피할 수 있습니다 S.

tar --transform='s|^\./||S' -cf - . | xz > file.tar.xz

표준 pax명령에는 동등한 명령이 없습니다.

답변3

첫째, 사용법으로 판단하면 --absolute-namesGNU Tar 옵션을 사용해도 괜찮습니다. 이 경우 다음 패턴에 따라 해결 방법은 간단합니다.

tar -cf archive.tar --transform s/..//S .

인수는 아카이브에 저장되기 전에 각 이름에 적용되는 패턴 --transform입니다 . sed점과 슬래시라는 처음 두 문자를 제거했습니다. 이 S플래그는아니요심볼릭 링크의 대상을 대체합니다.

디렉터리에 .아카이브에 들어가야 하는 숨겨진 항목(다음으로 시작하는 항목)이 포함되어 있지 않은 경우 cd아카이브로 들어갈 수 있으며 다음 패턴을 사용할 수 있습니다 *.

( cd "$dir" && tar -cf - -- * ) | xz -c > "$output/$name.$date.txz"

이 디렉토리 변경을 쉘 하위 프로세스로 제한하기 위해 괄호를 사용합니다. 파이프의 오른쪽 요소는 xz ...원래 디렉터리에서 실행되므로 $output상대적인 경우 예상대로 작동합니다. 실패하면 &&실행되지 않도록 이를 사용합니다.tarcd

이름이 여러 개인 경우 .에 표시된 대로 명시적으로 나열할 수 있습니다 tar ... * .important1 .important2.

GNU 특정 옵션 에 관해 말하자면 , 이 옵션의 임무는 경로의 선두(그렇지 않으면 제거될)를 --absolute-names보존하는 것인데 여기서는 발생하지 않기 때문에 삭제했습니다 ./

이것이 의미가 있으려면 다음을 수행해야 합니다.

tar -cf whole-fs.tar --absolute-names /
tar -cf etc-dir.tar --absolute-names /etc

답변4

기본적으로 불필요한 행간을 제거하는 첫 번째 무료 tar구현을 어떻게 사용할 수 있습니까 ?star./

별은 다음에서 얻을 수 있습니다:

https://sourceforge.net/projects/s-tar/

개발 스냅샷은 다음 위치에 있습니다.

http://schilytools.sourceforge.net/

Star는 원래 1982년에 만들어졌으며 수년 동안 모든 Linux 배포판의 일부였습니다. 그런 다음 gtargtar에 없거나 버그가 있는 방식으로 구현된 Linux 관련 기능이 포함되어 있음에도 불구하고 알 수 없는 이유로 대부분의 배포판에서 이를 삭제했습니다 . 다른 tar 구현보다 문제가 덜 발생하기 때문에 많은 시스템 관리자가 스타를 받고 컴파일한다는 것을 이해합니다.

실제로 libfindstar는 2004년부터 포함되어 다른 tar 구현이 한 단계로 수행할 수 없거나 전혀 수행할 수 없는 작업을 수행할 수 있게 해줍니다. 내장된 기능으로 find인해 많은 작업이 더 쉬워집니다.

다른 tar 구현의 많은 기능은 star에서 처음 등장했으며 나중에 다른 tar 구현에 포함되었습니다. 현재 다양한 tar 구현에 사용되는 POSIX.1-2001 표준을 기반으로 하는 대부분의 아카이브 형식 확장은 star에서 가져왔습니다.

관련 정보