Script de shell para testar a presença de caracteres especiais e bloquear arquivos especiais

0

Eu tenho os dois arquivos a seguir no meu diretório de trabalho:

test.txt e img.jpg

test.txt é um arquivo especial de caracteres

img.jpg é um arquivo especial de bloco

Agora, quero descobrir se esses arquivos são arquivos especiais de caracteres ou se devem bloquear arquivos especiais usando o shell script.

Eu escrevi os dois scripts de shell a seguir:

Primeiro -

#! /bin/bash

echo -e "Enter file name: \c"
read file_name

if [ -c $file_name ]
then
    echo Character special file $file_name found
else
    echo Character special file $file_name not found

Entrada:

test.txt

Saída:

Character special file test.txt not found

Segundo -

#! /bin/bash

echo -e "Enter file name: \c"
read file_name

if [ -b $file_name ]
then
    echo Block special file $file_name found
else
    echo Block special file $file_name not found

Entrada:

img.jpg

Saída:

Block special file img.jpg not found

Onde estou indo errado?

    
por Sonevol 16.07.2017 / 06:36

2 respostas

3

Você está um pouco errado em suas suposições. Bloquear arquivos especiais são coisas como partição do disco rígido, dispositivos de memória. Por exemplo, a partição principal do meu disco rígido é /dev/sda1 . O sinalizador do teste (também conhecido como [ ) -b funcionará para isso, mas não funcionará para um arquivo de imagem, que é considerado um arquivo normal.

$ test -b ./Pictures/NOTEBOOKS/8.jpg && echo "It's a block device" || echo "Not  a block device"                                                                                        
Not  a block device
$ test -b /dev/sda1  && echo "It's a block device" || echo "Not  a block device"                                                                                                        
It's a block device

Dispositivos de caractere são coisas como os consoles tty e serial. Por exemplo:

$ test -c /dev/tty1 && echo "It's a character device" || echo "Not a character dev"                                          
It's a character device

E stat pode dizer praticamente essa mesma informação, apenas em forma de texto em vez de status de saída como test :

$ stat --printf "%n\t%F\n"  /dev/tty1 /dev/sda1 ./mytext.txt ./Pictures/NOTEBOOKS/8.jpg                                      
/dev/tty1   character special file
/dev/sda1   block special file
./mytext.txt    regular file
./Pictures/NOTEBOOKS/8.jpg  regular file

O que você deve fazer é usar o comando file e verificar sua saída:

$ file ./Pictures/NOTEBOOKS/8.jpg                                                                                                                                                       
./Pictures/NOTEBOOKS/8.jpg: JPEG image data, JFIF standard 1.02, aspect ratio, density 100x100, segment length 16, baseline, precision 8, 750x750, frames 3
$ file /dev/sda1
/dev/sda1: block special (8/1)
$ file mytext.txt
mytext.txt: ASCII text
    
por 16.07.2017 / 10:15
3
$ cat test-c.bash 
#! /bin/bash

echo -e "Enter file name: \c"
read file_name

if [ -c $file_name ]
then
    echo Character special file $file_name found
else
    echo Character special file $file_name not found
fi
$ bash test-c.bash 
Enter file name: /dev/tty
Character special file /dev/tty found
$ cat test-b.bash
#! /bin/bash

echo -e "Enter file name: \c"
read file_name

if [ -b $file_name ]
then
    echo Block special file $file_name found
else
    echo Block special file $file_name not found
fi
$ bash test-b.bash 
Enter file name: /dev/sda
Block special file /dev/sda found

Exceto pelo fi ausente em seus programas, eles fazem o que se espera.

Sua suposição ...

test.txt is a character special file

img.jpg is a block special file

... provavelmente está errado se você não os criou para atender a isso. usando mknod .
(Veja man mknod .)

Então, se os seus arquivos de teste são o que os nomes estão insinuando, eles são simplesmente arquivos normais (regulares).

O que você estava procurando?

Uma maneira de distinguir entre arquivos de texto e arquivos binários como em sistemas operacionais DOSish?

Este é um relicto de CP / M dias ou até mais antigo. O sistema de arquivos rastreou os tamanhos dos arquivos em blocos e, por isso, os arquivos de texto precisavam de um caractere de fim de arquivo para sinalizar o final do texto válido.

A consequência é que a concatenação de arquivos binários e arquivos de texto deve ser feita de maneira diferente.

Sistemas de arquivos Unixish rastreiam o tamanho do arquivo em blocos e em bytes realmente usados, então não há necessidade de sinalizar o final do texto usando um caractere final especial.

Se você quiser adivinhar o que está dentro de um arquivo, use o comando file :

$ file 20170130-094911-GMT.png 
20170130-094911-GMT.png: PNG image data, 744 x 418, 8-bit/color RGBA, non-interlaced
$ file calendar.txt 
calendar.txt: ASCII text

HTH!

    
por 16.07.2017 / 07:29