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