[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]
- Re: [shell-script] Saber se um arquivo é um arquivo texto., (continued)
Re: [shell-script] Saber se um arquivo é um arquivo texto., Antônio Flávio, 2008/12/16
Re: [shell-script] Saber se um arquivo é um arquivo texto., Julio C. Neves, 2008/12/17