다음 구조의 tar파일이 있습니다.
- dir1
-- file
- dir2
- dir3
을 실행하면 tar -xf tarfile.tar.gz dir1/file
파일이 포함된 dir1이 생성됩니다. 대신에 디렉토리 없이 파일을 가져오고 싶습니다. 파일을 이동하고 디렉터리를 삭제할 수 있지만 tar 명령이 해당 작업을 직접 지원하는지 궁금합니다.
저는 알파인 리눅스를 사용하고 있습니다.
답변1
gunzip
POSIXly( POSIX 명령이 아닌 부분 제외 ):
gunzip < file.tar.gz | pax -rs'|.*/||' dir1/file1
와 함께 bsdtar
:
tar -s'|.*/||' -xf file.tar.gz dir1/file1
GNU를 사용하면 tar
:
tar --transform='s|.*/||' -xf file.tar.gz dir1/file1
와 함께 star
:
star -s '|*/||' -x -f file.tar.gz dir1/file1
이들 중 일부의 경우 파일이 심볼릭 링크인 경우 대체는 심볼릭 링크의 대상에도 영향을 미칩니다.
답변2
stdout(-O)으로 추출하여 원하는 파일 이름으로 파이프할 수 있습니다.
답변3
Ruby의 내 솔루션은 다음과 같습니다. 나는 심볼릭 링크를 제대로 처리하려고 시도하지 않지만 물론 추가할 수도 있습니다.
outfiles = `tar zxvf #{ARGV[0]}`
root_dirs = {}
outfiles.each_line do |l|
s = l.split('/')
root_dirs[s[0]] = 1
`mv #{l.chomp} ./#{s[-1]}`
end
root_dirs.each_key {|rd| `rm -rf #{rd}`}