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