$ 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
За исключением отсутствующего fi
в ваших программах, они делают то, что и следовало ожидать.
Ваше предположение...
test.txt is a character special file
img.jpg is a block special file
...вероятно, это неправильно, если вы не создали их для выполнения этого, например. используя mknod
.
(См. man mknod
.)
Таким образом, если ваши тестовые файлы соответствуют названиям, то это просто обычные (обычные )файлы.
Что вы искали?
Способ различать текстовые файлы и двоичные файлы, как в операционных системах DOS?
Это реликт времен CP/M или даже старше. Файловая система действительно отслеживала размеры файлов в блоках, и поэтому текстовые файлы нуждались в символе конца файла, чтобы пометить конец действительного текста.
Следствием этого является то, что объединение двоичных файлов и текстовых файлов должно выполняться по-разному.
Файловые системы Unix отслеживают размер файла в блоках и в фактически используемых байтах, поэтому нет необходимости помечать конец текста с помощью специального символа окончания.
Если вы хотите угадать, что находится внутри файла, вы можете использовать команду 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
ХТХ!
Рассматривали ли вы возможность добавления простой команды grep в качестве дополнительного канала? Например,
$ sudo tcpdump -c 5 -q -i eno1 -nn -vvv tcp | sort | uniq | grep '>'