플래그를 사용하여 tar 파일을 생성합니다 -P
. 이는 모든 경로가 절대 경로임을 의미합니다( /
파일 이름에서 선행이 제거되지 않음). 여러 디렉터리를 타르링하고 각 파일을 올바른 위치에 추출해야 하기 때문에 이 방법을 사용합니다.
tar 파일을 추출하기 위해 스크립트를 사용하고 있으며 선택적 인수가 제공되는 경우 파일을 다른 디렉터리로 추출하는 기능이 필요합니다.
다음과 같이 tar 파일을 만듭니다.
tar pcjfPv "${ARCHIVE_NAME}".tmp.bz ${DIR_A} ${DIR_B}
${DIR_A}
이고 입니다 ./path/a
${DIR_B}
/path/b
인수 없이 추출 스크립트를 실행하면 파일이 올바른 디렉터리로 이동할 것으로 예상됩니다. 이 부분은 에서 예상대로 작동합니다 tar mxfvjpP
.
/path/from/argument/path/a
그러나 스크립트가 인수의 경로를 수신하면 파일을 및 으로 추출하고 싶습니다 /path/from/argument/path/b
.
이것이 가능합니까? 이것이 내가 현재 가지고 있는 것입니다:
if [ ! -d "${EXTRACT_TO}" ]; then
echo "${EXTRACT_TO} does not exist, creating."
mkdir -p ${EXTRACT_TO}
fi
tar mxfvjP - -C ${EXTRACT_TO}
작동하지 않습니다. 의 경로가 ${EXTRACT_TO}
생성되었지만 파일은 여전히 /path/a
및 으로 추출됩니다 /path/b
.
메모: tar 파일을 수정할 수 없습니다.
답변1
내 데비안 추출에서없이 -P
수익률 Removing leading '/' from member names
. 아마도 필요한 것은 -P
다른 디렉토리로 추출하는 동안 사용하지 않는 것뿐입니다.
위의 접근 방식에 문제가 있는 경우 --transform
. 에서 man 1 tar
:
--transform=EXPRESSION
, 파일 이름을 변환하려면 바꾸기를--xform=EXPRESSION
사용하십시오 .sed
EXPRESSION
그래서 이거
tar -x --transform='s|^/||' …
각 경로에서 하나의 선행 슬래시(있는 경우)를 제거합니다. 하지만 왜냐하면////foo
는 다음과 같습니다/foo
, 다음이 더 나은 것 같습니다:
tar -x --transform='s|^/*||' …
모든 선행 슬래시가 제거됩니다.