BSD tar를 사용하여 동일한 기본 이름을 가진 디렉터리에 아카이브를 추출합니다.

BSD tar를 사용하여 동일한 기본 이름을 가진 디렉터리에 아카이브를 추출합니다.

GNU tar를 사용하면 아카이브의 기본 이름을 따서 명명된 디렉터리에 아카이브의 내용을 추출할 수 있습니다.

$ touch foobar
$ gnutar czf archive.tar.gz foobar
$ gnutar --one-top-level -xf archive.tar.gz
$ ls archive/foobar
archive/foobar

여러 명령을 실행하여 BSD tar를 사용하여 동일한 결과를 얻을 수 있습니다.

$ destdir=$(basename archive.tar.gz .tar.gz)
$ mkdir $destdir
$ bsdtar -C $destdir -xf archive.tar.gz
$ ls archive/foobar
archive/foobar

그러나 나는하나의이 명령은 GNU tar와 같습니다. 물론 명령을 쉘 스크립트나 쉘 함수로 래핑하는 것도 가능하지만, 어떤 기능이 있는지 궁금합니다.내장BSD tar는 동일한 결과를 생성하므로 하나의 명령만 필요합니까?


배경: GNU tar는 현재 비 Linux 플랫폼에서 확장 속성을 지원하지 않는 것 같기 때문에 BSD tar를 사용하고 싶습니다. 적어도 Homebrew를 통해 설치된 macOS GNU tar는 현재 확장 속성 지원으로 컴파일되지 않습니다.

답변1

당신은 자신의 문제를 거의 해결했습니다. 코드를 약간 매개변수화하면 함수를 생성하고 이를 자신 .profile이나 다른 bash시작 스크립트에 배치할 수 있습니다.

guntar() {

destdir="$(basename "$1" .tar.gz)"
mkdir "$destdir"
bsdtar -C "$destdir" -xf "$1"
ls -l "$destdir"/

}

$ guntar archive.tar.gz 
total 1
-rw-------  1 jim  wheel  0 Jan 11 09:34 foobar

답변2

zsh 사용:

() { bsdtar -"s|^|${${1:t}%.(tar*|t?z|xip|iso|7z)}/|' -xf $1; } path/to/some/file.tgz

파일 경로를 익명 함수에 전달합니다. 여기서 옵션을 사용하여 -sbsdtar에서 지원하는 일부 아카이브 형식의 기본 이름(접미사 제외)을 추출된 경로에 추가합니다.

관련 정보