Primeiramente, a julgar pelo uso de --absolute-names
, você não se importa em usar as opções do GNU Tar. Nesse caso, a solução é simples, de acordo com esse padrão:
tar -cf archive.tar --transform s/..//S .
O argumento --transform
é um padrão sed
que é aplicado a cada nome antes de ser armazenado no arquivo. O nosso exclui os dois primeiros caracteres: o ponto e a barra. O sinal S
é para não fazer essa substituição nos alvos de links simbólicos.
Se o seu diretório não contiver entradas ocultas (aquelas que começam com .
) que precisam ir para o arquivo morto, você pode cd
para o diretório, onde você pode usar o *
padrão:
( cd "$dir" && tar -cf - -- * ) | xz -c > "$output/$name.$date.txz"
Note que limitamos essa alteração de diretório a um subprocesso de shell usando parênteses. O elemento direito do pipeline, xz ...
, é executado no diretório original, portanto, se $output
for relativo, ele funcionará como deveria. Usamos &&
para que não executemos tar
se o cd
falhar.
Se houver alguns nomes .
, eles podem ser listados explicitamente, como em tar ... * .important1 .important2
.
Falando da opção --absolute-names
GNU específica, eu descartei isso porque seu trabalho é reter um /
dos caminhos (que de outra forma seriam eliminados), o que não ocorrerá aqui.
Para que isso seja significativo, você precisa fazer algo como:
tar -cf whole-fs.tar --absolute-names /
tar -cf etc-dir.tar --absolute-names /etc