Mostrando tipos de arquivos Unix
A forma como essa pergunta é apresentada aparece quando o usuário está tentando exibir o tipo de arquivo no tipo de arquivo Unix . Para tal, não é necessário um script, pois já existem utilitários capazes de exibir tais informações.
Em particular, o comando stat
é bem adequado para esse propósito. Por padrão, stat
mostra uma saída longa com muitas informações, mas podemos usar as opções -c
, --format
ou --printf
(observe que ela interpreta símbolos de escape de barra invertida) para obter a saída desejada. Por exemplo,
$ stat -c '%n: %F' /etc/passwd /etc/resolv.conf /etc
/etc/passwd: regular file
/etc/resolv.conf: symbolic link
/etc: directory
$ stat --printf '%n: %F\n' /etc/passwd /etc/resolv.conf /etc
/etc/passwd: regular file
/etc/resolv.conf: symbolic link
/etc: directory
Outro comando que podemos usar é find
, que tem -printf
opção, mas difere em especificadores de conversão (os símbolos %<letter>
) e o fato de gerar o tipo de arquivo em letras (veja o man find
para tipo de arquivo para correspondência carta):
$ find /etc/passwd /etc/resolv.conf /etc -prune -printf "%p:%y\n"
/etc/passwd:f
/etc/resolv.conf:l
/etc:d
É claro que, se houver necessidade, sempre poderemos usar o comando [
ou test
, mas isso exigirá um pouco mais de trabalho; no entanto, dessa forma, não precisamos confiar em nada externo; é um modo portátil, embora provavelmente não seja o ideal.
#!/bin/sh
check_filetype(){
if [ -f "" ];then
if [ -h "" ]; then
printf "%s\n" ": symbolic link"
else
printf "%s\n" ": regular"
fi
elif [ -d "" ]; then
printf "%s\n" ": directory"
elif [ -c "" ]; then
printf "%s\n" ": character device"
elif [ -p "" ]; then
printf "%s\n" ": named pipe"
elif [ -S "" ]; then
printf "%s\n" ": socket"
fi
}
for arg
do
check_filetype "$arg"
done
E é assim que funcionaria:
$ ./checkft.sh /etc/passwd /etc/resolv.conf /etc test.fifo /dev/tty1
/etc/passwd: regular
/etc/resolv.conf: symbolic link
/etc: directory
test.fifo: named pipe
/dev/tty1: character device
Mostrando o conteúdo do arquivo
Se quisermos obter informações detalhadas sobre o tipo de arquivo no que diz respeito ao conteúdo, há duas maneiras de abordar as coisas. Um, via tipo mime e o outro - via magic number , os primeiros bits de um arquivo. Embora o tipo mime seja originalmente usado para determinar o tipo de arquivo na Internet, atualmente muitos aplicativos de desktop dependem da consulta de informações do tipo mime para exibir corretamente ícones de arquivos e abri-los com aplicativos apropriados.
Para esse propósito, existe o comando mimetype
:
$ mimetype /etc/ /etc/resolv.conf /etc/passwd test.fifo
/etc/: inode/directory
/etc/resolv.conf: inode/symlink
/etc/passwd: text/plain
test.fifo: inode/fifo
E para realizar testes com "números mágicos", usamos o comando file
:
$ file /etc/ /etc/resolv.conf /etc/passwd test.fifo
/etc/: directory
/etc/resolv.conf: symbolic link to ../run/resolvconf/resolv.conf
/etc/passwd: ASCII text
test.fifo: fifo (named pipe)
que também pode fazer o trabalho de mimetype
:
$ file --mime-type /etc/ /etc/resolv.conf /etc/passwd test.fifo
/etc/: inode/directory
/etc/resolv.conf: inode/symlink
/etc/passwd: text/plain
test.fifo: inode/fifo