tar - extrai a estrutura de diretório de descarte

33

unzip tem uma boa opção -j , onde a estrutura de diretórios do arquivo é descartada, e todos os arquivos são extraídos no mesmo diretório.

Existe uma maneira de fazer tar funcionar da mesma maneira? Nada na man page parece indicar isso.

Então, existe uma alternativa, de preferência Software Livre, ferramenta que fará isso?

    
por Benji XVI 17.11.2009 / 21:58

5 respostas

66

O GNU tar vive em featuritis, então naturalmente também tem algumas opções para isso. link

Se você quiser apenas remover alguns segmentos de caminho, o --strip-components=n ou --strip=n geralmente será:

 tar xvzf tgz --strip=1

Mas também é possível regex-reescrever os arquivos a serem extraídos (os sinalizadores são --transform ou --xform e aceitam ereg com o /x modifer):

 tar xvzf tgz --xform='s#^[^/]+#.#x'
                 # or 's#^.+/##x' for discarding all paths

Para listar um tar, você precisa da opção --show-transformed adicional:

 tar tvzf tgz --show-transformed --strip=1 --xform='s/abc/xyz/x'

Eu acredito que as opções de reescrita também funcionem para empacotamento, não apenas para extração. Mas pax tem obviamente uma sintaxe mais agradável.

    
por 11.01.2012 / 14:14
13

Você pode fazer isso com facilidade em duas etapas. Adaptar conforme necessário:

$ mkdir /tmp/dirtree
$ tar xfz /path/to/archive -C /tmp/dirtree
$ find /tmp/dirtree -type f -exec mv -i {} . \;
$ rm -rf /tmp/dirtree
    
por 18.11.2009 / 03:18
8

pax pode fazer isso:

pax -v -r -s '/.*\///p' < archive.tar

ou

zcat archive.tar.gz | pax -v -r -s '/.*\///p'

Você pode verificar a operação de substituição de nome primeiro, omitindo a opção -r .

    
por 01.07.2010 / 18:18
1

Uma possível solução que não requer a instalação de nada.

  1. use tar tvf para pegar todos os arquivos do tarball
  2. Extraia esses arquivos individualmente - tenha tar tar para stdout & redirecionar para $ filename

    tar -tvf $1 | grep -v "^d" | \
                  awk '{for(i=6;i<NF+1;i++) {printf "%s ",$i};print ""}' |\
                  while read filename
                  do
                     tar -O -xf $1 "$filename" > 'basename "$filename"'
                  done
    

salve como extract.sh e execute como extract.sh myfile.tar . Ele também irá sobrescrever qualquer nome de arquivo duplicado encontrado nos diretórios extraídos do tarball.

    
por 17.11.2009 / 23:44
-1
tar xf foo.tar.gz foo/path/to/file/bar.mp3 -O > bar.mp3

A opção -O extrai um arquivo para a saída padrão e > redireciona essa saída para um arquivo. Então, no meu exemplo, eu estou extraindo o foo.mp3 e redirecionando-o para o bar.mp3. Os nomes dos arquivos são arbitrários.

    
por 13.03.2015 / 02:51