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
교체 --transform
는 s|^\./||
심볼릭 링크 대상에서도 작동하므로 foo -> ./bar
현재 디렉터리에 심볼릭 링크가 있으면 foo -> bar
.
GNU를 사용할 때 tar
플래그를 전달하면 이를 피할 수 있습니다 S
.
tar --transform='s|^\./||S' -cf - . | xz > file.tar.xz
표준 pax
명령에는 동등한 명령이 없습니다.
답변3
첫째, 사용법으로 판단하면 --absolute-names
GNU Tar 옵션을 사용해도 괜찮습니다. 이 경우 다음 패턴에 따라 해결 방법은 간단합니다.
tar -cf archive.tar --transform s/..//S .
인수는 아카이브에 저장되기 전에 각 이름에 적용되는 패턴 --transform
입니다 . sed
점과 슬래시라는 처음 두 문자를 제거했습니다. 이 S
플래그는아니요심볼릭 링크의 대상을 대체합니다.
디렉터리에 .
아카이브에 들어가야 하는 숨겨진 항목(다음으로 시작하는 항목)이 포함되어 있지 않은 경우 cd
아카이브로 들어갈 수 있으며 다음 패턴을 사용할 수 있습니다 *
.
( cd "$dir" && tar -cf - -- * ) | xz -c > "$output/$name.$date.txz"
이 디렉토리 변경을 쉘 하위 프로세스로 제한하기 위해 괄호를 사용합니다. 파이프의 오른쪽 요소는 xz ...
원래 디렉터리에서 실행되므로 $output
상대적인 경우 예상대로 작동합니다. 실패하면 &&
실행되지 않도록 이를 사용합니다.tar
cd
이름이 여러 개인 경우 .
에 표시된 대로 명시적으로 나열할 수 있습니다 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 배포판의 일부였습니다. 그런 다음 gtar
gtar에 없거나 버그가 있는 방식으로 구현된 Linux 관련 기능이 포함되어 있음에도 불구하고 알 수 없는 이유로 대부분의 배포판에서 이를 삭제했습니다 . 다른 tar 구현보다 문제가 덜 발생하기 때문에 많은 시스템 관리자가 스타를 받고 컴파일한다는 것을 이해합니다.
실제로 libfind
star는 2004년부터 포함되어 다른 tar 구현이 한 단계로 수행할 수 없거나 전혀 수행할 수 없는 작업을 수행할 수 있게 해줍니다. 내장된 기능으로 find
인해 많은 작업이 더 쉬워집니다.
다른 tar 구현의 많은 기능은 star에서 처음 등장했으며 나중에 다른 tar 구현에 포함되었습니다. 현재 다양한 tar 구현에 사용되는 POSIX.1-2001 표준을 기반으로 하는 대부분의 아카이브 형식 확장은 star에서 가져왔습니다.