extrair arquivos para um caminho relativo de um arquivo tar que estava sendo criado com o sinalizador -P

extrair arquivos para um caminho relativo de um arquivo tar que estava sendo criado com o sinalizador -P

Estou criando um arquivo tar usando o -Psinalizador, o que significa que todos os caminhos são absolutos (o início /não é removido dos nomes dos arquivos). Eu o uso porque estou tarando vários diretórios e preciso que cada arquivo seja extraído para o local correto.

Estou usando um script para extrair o arquivo tar e preciso extrair os arquivos para outro diretório se um argumento opcional for fornecido.

Eu crio o arquivo tar assim:

tar pcjfPv "${ARCHIVE_NAME}".tmp.bz  ${DIR_A} ${DIR_B}

${DIR_A}é /path/ae ${DIR_B}é /path/b.

Se eu executar o script de extração sem nenhum argumento, espero que os arquivos vão para os diretórios corretos. Esta parte funciona como esperado com tar mxfvjpP.

No entanto, quando o script recebe um caminho no argumento, quero extrair os arquivos para /path/from/argument/path/ae /path/from/argument/path/b.

Isso é possível? Isso é o que tenho atualmente:

if [ ! -d "${EXTRACT_TO}" ]; then
    echo "${EXTRACT_TO} does not exist, creating."
    mkdir -p ${EXTRACT_TO}
fi
tar mxfvjP - -C ${EXTRACT_TO}

Isso não funciona. O caminho in ${EXTRACT_TO}é criado, mas os arquivos ainda são extraídos para /path/ae /path/b.

OBSERVAÇÃO: não consigo modificar o arquivo tar.

Responder1

Na minha extração do Debiansem -Prendimentos Removing leading '/' from member names. Talvez tudo que você precise é não usar -Pao extrair para outro diretório.


Se houver algum problema com a abordagem acima, considere --transform. De man 1 tar:

--transform=EXPRESSION, --xform=EXPRESSION
Use sedsubstituir EXPRESSIONpara transformar nomes de arquivos.

Então, é isso

tar -x --transform='s|^/||' …

removerá uma barra inicial (se houver) de cada caminho. Mas porque////fooé equivalente a/foo, o seguinte parece melhor:

tar -x --transform='s|^/*||' …

Isso removerá todas as barras iniciais.

informação relacionada