다음과 같이 tar 아카이브에서 특정 파일을 추출할 수 있습니다.
tar xvf gh_2.5.1_linux_armv6.tar.gz gh_2.5.1_linux_armv6/bin/gh
이렇게 하면 현재 디렉터리에 추출되지만 gh
파일은 여전히 아카이브의 디렉터리 구조 내에 있습니다. 현재 또는 특정 디렉토리에 파일을 추출하는 방법이 있습니까?
답변1
Gnu tar의 경우 다음을 시도하십시오.
tar xvf gh_2.5.1_linux_armv6.tar.gz --one-top-level=. gh_2.5.1_linux_armv6/bin/gh
--one-top-level
또는 주석에서 제안한 대로 이 예에서는 대신 을 사용 --strip-components=2
하지만 다른 디렉터리에서 여러 파일을 추출하려는 경우에는 작동하지 않을 수 있습니다.
답변2
GNU tar를 사용하여 응답합니다.
tar xvf gh_2.5.1_linux_armv6.tar.gz gh_2.5.1_linux_armv6/bin/gh -O > gh
위의 코드 블록을 사용해 볼 수 있습니다. O
옵션은 출력을 표준 출력으로 만드는 것입니다. 따라서 이를 리디렉션 연산자와 결합합니다.
답변3
설명에서 제안한 대로 이 옵션은 --strip-components=N
아카이브의 동일한 수준에 있는 단일 파일 또는 여러 파일에 대해 잘 작동합니다. 아카이브의 임의의 수의 파일에 대해 작동하는 또 다른 GNU 옵션은
(또는tar
--xform
--transform
). 다음 형식의 대체 표현식을 사용하여
파일 이름을 수정할 수 있습니다.sed
s/regexp/replace/[flags]
따라서 귀하의 경우 표현식은 s|.*/||
파일 경로에서 모든 주요 구성 요소를 제거합니다.
tar xvf gh_2.5.1_linux_armv6.tar.gz --xform='s|.*/||' gh_2.5.1_linux_armv6/bin/gh
gh
상위 디렉터리 없이 현재 디렉터리의 파일 만 추출합니다 . 또한 --show-transformed-names
테스트 실행과 같이 요청된 변환을 적용하는 옵션을 볼 수 있습니다 .
tar -tf archive.tar.gz --xform='s|.*/||' --show-transformed-names
이는 패턴을 기반으로 다른 디렉터리로 추출하는 등 다른 옵션과 결합될 수 있습니다.
tar -xvzf archive.tar.gz --xform='s|.*/||' -C dest_dir --wildcards --no-anchored 'match*'