comando para obter o nome de diretório mais importante em arquivos compactados

4

Os nomes dos arquivos são mostrados abaixo, mas o diretório será libgit2-0.21-1 quando tar xvf v0.21.1.tar.gz , então como usar o one-liner para obter o nome do diretório (report error if more than two directory):

tar tvf v0.21.1.tar.gz | head
drwxrwxr-x root/root         0 2014-08-05 08:09 libgit2-0.21.1/
-rw-rw-r-- root/root      1169 2014-08-05 08:09 libgit2-0.21.1/.HEADER
-rw-rw-r-- root/root        22 2014-08-05 08:09 libgit2-0.21.1/.gitattributes
-rw-rw-r-- root/root       321 2014-08-05 08:09 libgit2-0.21.1/.gitignore
-rw-rw-r-- root/root      1246 2014-08-05 08:09 libgit2-0.21.1/.mailmap

Eu tenho uma solução para isso, mas obviamente esta não é a melhor (eu também tenho que verificar se há mais de um diretório no topo):

mkdir libgit2 && tar xvf v0.21.1.tar.gz -C libgit2 --strip-components 1
    
por schemacs 26.10.2014 / 11:43

2 respostas

2

Execute o seguinte script com o seu tarball como parâmetro da linha de comando

#!/bin/bash

DIR=$(tar tvf ${1} | egrep -o "[^ ]+/$")

if [ $(echo ${DIR} | egrep -o " " | wc -l) -eq 0 ]; then
    echo ${DIR};
else
    echo "ERROR: multiple directories in tarball base"
    exit 1
fi
    
por 26.10.2014 / 13:07
1

Atualizar Desculpe, você também queria o nome do diretório mais popular. Eu atualizei o comando para incluir um 'else'. Se apenas um diretório for encontrado, ele irá ecoar seu nome. Se 'ERROR for lançado, você pode apenas visualizar o conteúdo de' test.file 'para ver quais diretórios estão no tar.

Tente isto:

$ zcat test.tar.gz | tar xvf - | \
    awk -F/ '{print $1}' | \
    uniq > test.file && \
    if (($(wc -l 'test.file' | \
    awk '{print $1}')>1));then echo "ERROR";else cat test.file;fi

man zcat

zcat é idêntico ao gunzip -c. (Em alguns sistemas, o zcat pode ser instalado como gzcat para preservar o link original para compactação). O zcat descompacta uma lista de arquivos na linha de comandos ou sua entrada padrão e grava os dados descompactados na saída padrão. O zcat descompactará arquivos que tenham o número mágico correto, tenham ou não um sufixo .gz.

awk -F / '{print $ 1} | uniq

Imprime a primeira palavra marcada por '/', que é única.

> test.file

Gravar saída para o arquivo

(($ (wc -l 'test.file' | awk '{print $ 1}') > 1))

A construção dupla ((..)) permite a expansão e avaliação aritmética. wc -l obtém contagem de linhas no arquivo. awk '{print $1}')>1 obtém somente a primeira coluna, que é o número da contagem de linhas e vê se esse número é maior que 1. then echo "ERROR" print 'ERRO' se mais de um diretório for encontrado no arquivo tar.

Espero que ajude.

    
por 26.10.2014 / 15:33

Tags