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: MrBiTS
Subject: Re: [shell-script] Saber se um arquivo é um arquivo texto.
Date: Wed, 17 Dec 2008 07:15:25 -0200
User-agent: Thunderbird 2.0.0.18 (X11/20081125)

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

> Acho que não me expliquei direito.
> Foi isso mesmo que eu quis mostrar, que arquivo regular != arquivo
> texto, portanto o que ele queria fazer, descobrir se é texto através
> do test -f, não é a solução.

Em Unix, tudo são arquivos. Seu console é um arquivo. Sua impressora é um 
arquivo. Sua placa de rede é um arquivo. Seu teclado é um
arquivo. Se você tem um tablet, a tela com capacidade de reconhecimento de 
toque é um arquivo. E vamos assim até o fim dos tempos.
Há, entretanto, tipos de arquivos. Temos arquivos de dispositivos ( /dev/tty1, 
/dev/sda1 ), arquivos diretórios ( /home ), arquivos
de socket ( /tmp/mysqld ), arquivos de links ( simbólicos ou não ), arquivos 
pipe ( ou FIFO ), arquivos de bloco, arquivos
regulares. Arquivos regulares são aqueles que não são diretórios, dispositivos, 
pipes, ou seja, que não possuem uma característica
especial. São os arquivos encontrados em maior número no sistema operacional.

Podemos distinguí-los através do comando ls -F ou ls -l ( que eu prefiro ). 
Teríamos algo assim:


$ ls -l
srwxrwxrwx  1 root   root       0 Dec 17 00:30 TargetPipe
- -rw-r--r--  1 nobody nobody     0 Dec 17 05:13 temp1.csv
- -rw-r--r--  1 nobody nobody     0 Dec 17 05:13 temp2.csv
drwxr-xr-x  2 nobody nobody  4096 Jun 11  2008 tmp

A identificação do arquivo fica imediatamente antes dos bits de permissões ( 
que é outro assunto extenso e que, se você não tem
idéia do que significam, é melhor recomeçar seus estudos pelo arroz com feijão 
). Temos na listagem, então, um arquivo socket ( a
linha começa com um "s" ), dois arquivos regulares ( a linha começa com "-" ) e 
um arquivo diretório ( a linha começa com "d" ).

Ainda temos os tipos "l", "c", "p" e "b", para link, dispositivo, pipe e bloco.

Portanto, como o Eri citou, o test -f não é solução para reconhecer um arquivo 
texto. Vejamos:

$ file temp1.csv
temp1.csv: empty
$ if [ -f temp1.csv ] ; then echo OK ; else echo NOK ; fi
OK

O arquivo tem uma "extensão" ( conceito errado em Unix, mas novamente outro 
assunto extenso ) .csv que, em outros ambientes, seria
reconhecida como um arquivo do MS-Excel. O comando file o reconheceu como 
"empty". Claro, não há dados no arquivo. Entretanto, o
test -f o reconheceu como um arquivo regular.

Um exemplos interessantes:

mrbits@rimmon:~$ file vigenere.sh
vigenere.sh: Bourne-Again shell script text executable

mrbits@rimmon:~$ file test.db
test.db: SQLite 3.x database

mrbits@rimmon:~$ file voo.pdf
voo.pdf: PDF document, version 1.4

mrbits@rimmon:~$ mv voo.pdf voo
mrbits@rimmon:~$ file voo
voo: PDF document, version 1.4

Essas linhas nos mostram que a "extensão" nada tem a ver como "tipo" do 
arquivo. Por outro lado, mostrou um arquivo que é um texto
executável, um script bash. Será que você considera isso um "arquivo texto" ? 
Ou será que você considera "arquivo texto" um
documento criado pelo MS-Word ? Talvez um criado pelo vi ?

Só para confundir:

mrbits@rimmon:~$ file teste.html
teste.html: ASCII text

mrbits@rimmon:~$ file wmpinfo.xml
wmpinfo.xml: Little-endian UTF-16 Unicode character data, with CRLF, CR line 
terminators

Estranho esse arquivo wmpinfo.xml. Vamos lê-lo:

mrbits@rimmon:~$ less wmpinfo.xml
"wmpinfo.xml" may be a binary file.  See it anyway?

Ele é "binário" porquê foi criptografado por mim, mas na verdade é um arquivo 
texto.

Portanto, o primeiro ponto é definir O QUE É um arquivo texto para você. Se for 
o documento do MS-Word e você procurar por "text" ou
"ascii" na definição do comando file, não funcionará. Veja:

mrbits@rimmon:~$ file Teste.doc
Teste.doc: Microsoft Office Document Microsoft Word Document

- --

Um abraço

.0. MrBiTs - address@hidden
..0 GnuPG  - 
http://keys.cardboard.net:11371/pks/lookup?op=get&search=0xAC37715A6DD1F186
000 http://www.mrbits.com.br


-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)

iEYEARECAAYFAklIwy0ACgkQrDdxWm3R8YbdGQCfY0VviXxW1C1jIdKcjzgx0FQo
PMoAmQEBbXJEylX3mHEF5RXAm8+ZdrEW
=Yl+U
-----END PGP SIGNATURE-----


reply via email to

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