-----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:

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

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

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

mrb...@rimmon:~$ mv voo.pdf voo
mrb...@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:

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

mrb...@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:

mrb...@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:

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

- --

Um abraço

.0. MrBiTs - [email protected]
..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-----

Responder a