답변:
GNU 타르는 기능성 염에 살고 있으므로 당연히 이에 대한 몇 가지 옵션이 있습니다.
http://www.gnu.org/software/tar/manual/html_node/transform.html
당신은 다음 몇 가지 경로 세그먼트를 제거하려는 경우 --strip-components=n
또는 --strip=n
자주 할 것입니다 :
tar xvzf tgz --strip=1
그러나 추출 할 파일을 정규식으로 다시 작성할 수도 있습니다 (플래그가 --transform
있거나 수정 자를 --xform
사용하여 ereg를 허용 함 /x
).
tar xvzf tgz --xform='s#^[^/]+#.#x'
# or 's#^.+/##x' for discarding all paths
타르를 나열하려면 추가 --show-transformed
옵션 이 필요합니다 .
tar tvzf tgz --show-transformed --strip=1 --xform='s/abc/xyz/x'
나는 다시 쓰기 옵션이 추출뿐만 아니라 포장에도 효과적이라고 생각합니다. 그러나 pax
분명히 더 좋은 구문이 있습니다.
s#.*/##
?
--strip
os x tar man 페이지에 언급되지 않았지만 어쨌든 작동합니다. 감사합니다!
--strip
와 사이에 차이점이 --strip-components
있습니까?
두 단계로 쉽게 수행 할 수 있습니다. 필요에 따라 조정하십시오.
$ mkdir /tmp/dirtree
$ tar xfz /path/to/archive -C /tmp/dirtree
$ find /tmp/dirtree -type f -exec mv -i {} . \;
$ rm -rf /tmp/dirtree
find -exec mv -i
대신 사용 find | xargs
) .... 간단한 단계 스크립트를 수행하지 않고도 모든 시스템에서 반복 할 수 있습니다.
tmpdir=$( mktemp -d )
임시 디렉토리를 만들 때 편리합니다
아무것도 설치하지 않아도되는 가능한 솔루션입니다.
tar tvf
를 사용 하여 tarball에서 모든 파일을 가져옵니다.해당 파일을 개별적으로 추출하십시오-tar를 stdout으로 추출하고 $ filename으로 리디렉션하십시오.
tar -tvf $1 | grep -v "^d" | \
awk '{for(i=6;i<NF+1;i++) {printf "%s ",$i};print ""}' |\
while read filename
do
tar -O -xf $1 "$filename" > `basename "$filename"`
done
extract.sh로 저장하고로 실행하십시오 extract.sh myfile.tar
. 또한 tarball에서 가져온 디렉토리에서 발견 된 중복 파일 이름을 덮어 씁니다.
tar xf foo.tar.gz foo/path/to/file/bar.mp3 -O > bar.mp3
이 -O
옵션은 파일을 표준 >
출력으로 추출하고 해당 출력을 파일로 리디렉션합니다. 내 예에서는 foo.mp3을 추출하여 bar.mp3로 리디렉션합니다. 파일 이름은 임의적입니다.