criando um arquivo tar sem incluir o diretório pai


62

Estou tentando criar um programa gráfico para o meu script.

Dentro do script eu uso o tar para criar um arquivo tar.

No programa gráfico, recebo o nome completo do arquivo que desejo criar um arquivo tar.

tar -cvf temp.tar /home/username/dir1/dir2/selecteddir 

Meu arquivo tar inclui home, nome de usuário, dir1, dir2 e selecteddir, enquanto eu quero que o tar crie um arquivo apenas incluindo o selecteddir.

Respostas:


79

Você pode usar a -Copção de tarpara fazer isso:

tar -C /home/username/dir1/dir2 -cvf temp.tar selecteddir

Na página do manual de tar:

-C directory
         In c and r mode, this changes the directory before adding the following files.  
         In x mode, change directories after opening the archive but before extracting 
         entries from the archive.

você sabe como eu posso dividir $ caminho para selecteddir e caminho até / home / username / dir1 / dir2 para que eu possa utilizador -C opção
Sujit Maharjan

@SujitMaharjan, você pode usar dirnamepara extrair tudo até "selecteddir" e basenameextrair "selecteddir". Experimente os dois comandos com o caminho $ como argumento.
Mkc

2
Vale acrescentar que isso é válido para o GNU e o BSD Tar.
Luke Exton

5
Observe que você não pode usar globbing com a opção -C. tar -C /home/username/dir1/dir2 -cvf temp.tar '*.csv'não vai funcionar.
Christian Long

Não funciona: tar: selecteddir: Não é possível executar stat: Nenhum tal lima ou diretório
tribbloid

11

Existem dois métodos que você pode usar para abordar esse problema.

O primeiro, na minha opinião, é mais fácil. Simplesmente cdno diretório diretamente acima do que você deseja compactar. Nesse caso seria dir2.

$ cd /home/username/dir1/dir2/
$ tar -cvf temp.tar selecteddir

A segunda maneira é usar a opção --transformque pega uma sedexpressão e a executa nos nomes dos arquivos. Nota: você terá que escapar /na sedexpressão.

$ tar -cvf temp.tar /home/username/dir1/dir2/selecteddir --transform='s/\/home\/username\/dir1\/dir2\///g'

O primeiro método precisa de um ponto (.) No final? Tentei-lo sem e tem: tar: Cowardly refusing to create an empty archive. Quando eu tenho o ponto, irritantemente faz com que a raiz contenha um diretório chamado .. Então, perto, mas não perfeito.
JW01

11
Além do meu comentário anterior. Eu resolvi meu problema. $ cd /home/username/dir1/dir2/ && tar -cvf temp.tar selecteddir *trabalhou para mim. Usando asterisco em vez de um ponto .. Atualização: Woops - Embora eu tenha perdido os arquivos ocultos.
JW01

6

Primeiro, vá para o diretório de trabalho,

cd /your/working/directory/ 

Então use magia *:-)

tar -cvf temp.tar *

Eu estou tentando arquivar diretórios ocultos e se eu adicioná-los diretamente (Não *) funciona, mas quando se utiliza * apenas adiciona o nome do arquivo para o arquivo ...
Ole

1

Na verdade, encontrei um problema ao usar a resposta de Ketan

tar -C / home / nome de usuário / dir1 / dir2 -cvf temp.tar selecteddir

Quando você deseja copiar todos os arquivos apenas no dir2, apenas todos os arquivos, então eu tento a idéia:

tar -C / home / nome de usuário / dir1 / dir2 -cvf temp.tar *

No entanto, quando você não está no diretório dir2, isso causaria problemas, pois * causaria arquivos tar no seu diectroy atual. E corrigi o problema usando o comando abaixo:

 tar -C /home/username/dir1/dir2 -cvf temp.tar ./

6
Mas o seu arquivo temp.tar contém .uma pasta raiz.
Cgrim #
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.