lista de arquivos Tar em um script bash

0

Eu tenho uma função vinculada a um alias para facilitar a listagem de arquivos.

function list-tar-archive {
  if [ "X$1" != 'X' ]; then
    out=tar -tf $1 | awk -F/ '{if (NF<3) print }'
    echo ${out}
  fi
}

alias list-tar='list-tar-archive'

Pouco confuso porque eu recebo "nenhum comando '-tf' encontrado" como a saída quando eu uso o alias.

~/workspace$ list-tar bits-and-bytes-proj.tgz
No command '-tf' found, did you mean:
 Command 'gtf' from package 'xserver-xorg-core' (main)
 Command 'tf' from package 'tf' (universe)
 Command 'tf' from package 'tf5' (universe)
 Command 'wtf' from package 'bsdgames' (universe)
-tf: command not found

Mas ...

~/workspace$ tar -tf bits-and-bytes-proj.tgz | awk -F/ '{if (NF<3) 
print }'
bits-and-bytes-proj/
**truncated**

???

    
por rpg711 27.09.2015 / 04:41

1 resposta

4
out=tar -tf $1 | awk -F/ '{if (NF<3) print }'

executa a variável de ambiente -tf $1 com out definida como tar .

O que você deve realmente fazer é:

list-tar() {
    if [[ $1 ]];then
        tar -tf "$1" | awk -F/ 'NF<3'
    fi
}

Observe a simplificação do programa awk : a ação padrão é {print} , então usei NF<3 como a regra que deve ser verdadeira para que a ação aconteça. (As regras não precisam ser /regex/ patterns (cujo padrão é corresponder a $0 ).) Um simples grep para linhas com menos de dois caracteres / também funcionaria.

Note também que capturar a saída em uma variável shell e, em seguida, ecoar é bobagem, a menos que você queira fazer algo com ela. Sua versão também quebra em nomes de arquivos com espaços neles. echo $out word-splits $out e, em seguida, echo space-separates multiple arguments. Então, vários espaços em branco se transformam em um único espaço, e você não pode dizer a diferença entre um espaço em um nome de arquivo e dois arquivos separados.

[[ $1 ]] é uma maneira melhor / mais óbvia de gravar [[ -n $1 ]] para testar uma variável de shell não vazia. Isso explica algumas das diferenças entre [ e [[ .

As funções do shell podem ser executadas como comandos, portanto, a menos que você tenha algum outro motivo ou esquema de nomenclatura, apenas dê à função o nome abreviado e não se preocupe com o alias.

    
por 27.09.2015 / 05:03

Tags