shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script] Saber se um arquivo é um arquivo texto.


From: Elder Marco
Subject: Re: [shell-script] Saber se um arquivo é um arquivo texto.
Date: Sat, 20 Dec 2008 15:20:29 -0200

Hmm, gostei dessa idéia Júlio. Acho que pode ser melhor que a que eu havia
mencionado. Eu fiz o script. Assim que aprender melhor Shell Script, devo
melhorar ele e  essa sua idéia é algo que  vou testar. Veja como ficou:

------------------------------------------------------------------------------------
#!/bin/bash
# tcatl -  Verifica se um dado arquivo é um arquivo
#          texto e, em caso afirmativo, exibe-o na
#          tela com o comando cat. É também possível
#          exiber com o less usando a opção -l ou a
#          opção --less.
# Autor:   Elder Marco
# Início:  15/12/2008    Última modificação: 20/12/2008


if [ $# -eq 0 -o $# -gt 3 ]; then
    echo "Uso: $0 [OPCÕES] [ARQUIVO]"
    exit 1
fi

# Se o número de parâmetros é 3, então o primeiro e
# o segundo devem ser uma opção e o terceiro tem de
# ser o nome do arquivo.
# Mas se esse número for 2, então o primero parâmetro
# é uma opção e o arquivo é o segundo parâmetro.
if [ $# -eq 3 ]; then
    OPCAO1=$1
    OPCAO2=$2
    ARQUIVO=$3
elif [ $# -eq 2 ]; then
    OPCAO1=$1
    OPCAO2=""
    ARQUIVO=$2
else
    OPCAO1=""
    OPCAO2=""
    ARQUIVO=$1
fi

# Arquivo existe?
if [ ! -e $ARQUIVO ]; then
    echo "$ARQUIVO: Arquivo não encontrado."
    exit 2

    # Tem permissão de leitura?
    elif [ ! -r $ARQUIVO ]; then
        echo "$ARQUIVO: Sem permissão de leitura."
        exit 2

    # É um arquivo texto?
    elif [ -z "$(file $ARQUIVO | grep "text")" ]; then
        echo "$ARQUIVO não é um arquivo texto."
        exit 2

    # Tudo OK.
    # Verifica como deve ser aberto. Nenhuma opção, usa o cat
    elif [ -z "$OPCAO1" -a -z "$OPCAO2" ]; then
        cat $ARQUIVO

    # $OPCAO1, parâmetro para o cat e $OPCAO2, nada. Abrir com a cat usando
    # o parâmetro.
    elif [ "$OPCAO1" != "-l" -a "$OPCAO1" != "--less" -a -z "$OPCAO2" ];
then
        cat $OPCAO1 $ARQUIVO

    # $OPCAO1  abrir com o less e $OPCAO2 nada. Abrir somente com o less
    elif [  \( "$OPCAO1" = "-l" -o "$OPCAO1" = "--less" \) -a -z "$OPCAO2"
]; then
        less $ARQUIVO

    # $OPCAO1 abrir com o less e $OPCAO2 parâmetro para o cat. Abrir com
    # o cat e redirecionar para o less.
    elif [  \( "$OPCAO1" = "-l" -o "$OPCAO1" = "--less" \) -a -n "$OPCAO2"
]; then
             cat $OPCAO2 $ARQUIVO | less

    # $OPCAO2 abrir com o less. $OPCAO1 obrigatoriamente deve ter um
    # parâmetro.
    elif [ "$OPCAO2" = "-l" -o "$OPCAO2" = "--less" ]; then
        cat $OPCAO1 $ARQUIVO | less
fi
--------------------------------------------------------------------------------------------------

Eu acho que não deveria ter usando tantos if's e tal... mas ainda estou
aprendendo. Falta prática :-)
Gostei dessa dica sua, agradeço.

Ah sim, o único arquivo que eu tenho conhecimento que poderia falhar esse
script até o momento é em um arquivo vazio (funciona com o /etc/sudoers se
ele tiver permissão de leitura, agora testei). Nesse caso, eu teria como
resposta do comando file um "empty" e ele não poderia ser aberto. Uma outra
coisa que pensei é seu eu tivesse uma saída diferente do comando file. Sei
lá, por exemplo, ele estivesse traduzida para o português, por exemplo. O
que me faz pensar que não é bom confiar em saída de programas, pois pode nem
sempre ser  a mesma. Acho que sua idéia pode dar mais certo mesmo por me
parecer uma forma mais segura de fazer os testes. Salvei ela aqui :-) Só,uma
coisinha é que ela falhou com o /etc/passwd dizendo que ele poderia ser
binário. Vou ter de ver isso.

Agradeço

[]'s


2008/12/18 Julio C. Neves <address@hidden>

>   Fala Elder,
> Realmente a idéia que te dei não tem teste nenhum, então provoque-o! Que
> tal
> assim?
>
> #!/bin/bash
> if [ $(cat "$1" | wc -c) -eq $(strings "$1" | wc -c) ]
> then
> cat arquivo
> else
> echo Acho melhor vc não listar este cara "($1)". Deve ser um binário
> fi
>
> Acho que o script é auto explicativo. Salve este script no arquivo "cata" e
> teste-o assim:
>
> ./cata /bin/ls (sugestão do meu amigo Eri) e em seguida faça ./cata
> /etc/passwd.
>
> --
> Abração,
> Julio
> *Cursos de Shell e Zenity nos finais de semana:
> - Em SP ligue (11) 2125-4747;
> - Em DF ligue (61) 3223-3000;
> - Turmas fechadas em outras cidades ligue (21) 8112-9988
> *
>
> 2008/12/18 Elder Marco <address@hidden <eldermarco%40gmail.com>>
>
> > Nesse caso, não adianta procurar por algum "text" na saída do comando e
> > foi
> > isso que me incomodou. A idéia do Júlio é interessante, mas nesse caso,
> não
> > haveria teste nenhum para saber se o arquivo é ou não texto. :-(
> >
>
> [As partes desta mensagem que não continham texto foram removidas]
>
>  
>



-- 
Elder Marco

Linux User: #471180

"O conhecimento é tristeza: aqueles que mais sabem são os que mais
profundamente devem lamentar a mais fatal verdade, a árvore do conhecimento
não é a da vida." (Versos extraídos da tragédia Manfred, de Byron e citado
por Nietzsche em "Humano, demasiado humano")


[As partes desta mensagem que não continham texto foram removidas]



reply via email to

[Prev in Thread] Current Thread [Next in Thread]