Estou criando um arquivo tar usando o -P
sinalizador, 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/a
e ${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/a
e /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/a
e /path/b
.
OBSERVAÇÃO: não consigo modificar o arquivo tar.
Responder1
Na minha extração do Debiansem -P
rendimentos Removing leading '/' from member names
. Talvez tudo que você precise é não usar -P
ao extrair para outro diretório.
Se houver algum problema com a abordagem acima, considere --transform
. De man 1 tar
:
--transform=EXPRESSION
,--xform=EXPRESSION
Usesed
substituirEXPRESSION
para 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.