Evitar o conteúdo de um .tar começar com './'

2

Eu quero fazer um backup de um diretório usando tar e xz, mas eu tenho um problema. Quando abro o arquivo, todos os arquivos e diretórios começam com ./ e não quero que isso aconteça.

file.tar.xz
    |---- ./directory
        |---- ./file1.txt
    |---- ./file2.txt        
    |---- ./file3.txt

Este é o código que estou usando:

tar -cf - -C $dir --absolute-names . | xz -c > $output/$name.$date.txz

O que preciso mudar para evitar isso?

    
por allnex 17.12.2015 / 17:04

4 respostas

3

Se você não se importar em não manipular arquivos ou diretórios com caracteres especiais em seus nomes, um nível abaixo de $dir :

tar -cf - -C "$dir" --absolute-names $(ls -A "$dir") | xz -c > "$output/$name.$date.txz"

Isso lista o conteúdo de $dir e informa tar para arquivar isso em vez de . , o que resulta no conteúdo de $dir que aparece na raiz do arquivo.

Como você não está começando a partir de um caminho / -rooted, não precisa do --absolute-names específico do GNU:

tar -cf - -C "$dir" $(ls -A "$dir") | xz -c > "$output/$name.$date.txz"
    
por 17.12.2015 / 18:07
2

Usando pax (o comando POSIX para arquivamento):

(cd -P -- "$dir" && pax -w's|^\./||' .) | xz > file.tar.xz

No entanto, como GNU tar ' --transform , a substituição s|^\./|| também é aplicada aos alvos de links simbólicos, portanto, se você tiver um symlink foo -> ./bar no diretório atual, ele será arquivado como foo -> bar .

Enquanto estiver com o% GNUtar, você pode evitá-lo passando o sinalizador S :

tar --transform='s|^\./||S' -cf - . | xz > file.tar.xz

O comando padrão pax não tem equivalente.

    
por 18.12.2015 / 12:31
2

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
    
por 18.12.2015 / 01:06
0

Que tal usar o primeiro livre tar implementation star que por padrão retira um início supérfluo ./ ?

Star está disponível em:

link

e os instantâneos de desenvolvimento estão em:

link

Star foi inicialmente criada em 1982 e por muitos anos fez parte de todas as distribuições Linux. Então, por razões desconhecidas, a maioria das distros a abandonou, mesmo que inclua recursos específicos do Linux que estão faltando em gtar ou que foram implementados de forma defeituosa no gtar. Tanto quanto eu posso dizer muitos sysadmins buscar estrela e compilá-lo porque causa menos problemas do que outras implementações de alcatrão.

O fato de que star inclui libfind desde 2004 torna possível fazer coisas, você não pode fazer em uma única etapa com outras implementações de alcatrão que você não pode fazer. Um built-in find torna muitas tarefas muito mais simples.

Note que muitos recursos em outras implementações de alcatrão apareceram primeiro em estrela e depois foram incluídos em outras implementações de alcatrão. A maioria das extensões de formato de arquivo baseadas no padrão POSIX.1-2001 que estão atualmente em uso em várias implementações de alcatrão são tiradas da estrela.

    
por 18.12.2015 / 11:20