用于测试字符特殊文件和块特殊文件是否存在的 Shell 脚本

用于测试字符特殊文件和块特殊文件是否存在的 Shell 脚本

我的工作目录中有以下两个文件:

test.txtimg.jpg

test.txt是一个字符特殊文件

img.jpg是一个块特殊文件

现在我想使用 shell 脚本查找这些文件是字符特殊文件还是块特殊文件。

我写了以下两个shell脚本:

第一的-

#! /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

输入:

test.txt

输出:

Character special file test.txt not found

第二-

#! /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

输入:

img.jpg

输出:

Block special file img.jpg not found

我哪里错了?

答案1

你的假设有点错误。块特殊文件是指硬盘分区、内存设备等。例如,我的硬盘驱动器的主分区是/dev/sda1.测试的(又名[-b标志将适用于此,但它不适用于图片文件,该文件被视为常规文件。

$ 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

字符设备例如 tty 和串行控制台。例如:

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

并且stat可以告诉您几乎相同的信息,只是以文本形式而不是像这样的退出状态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

您应该做的是使用file命令并检查其输出:

$ 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

答案2

$ 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是一个字符特殊文件

img.jpg 是一个块特殊文件

...如果您没有创建它们来实现此目的,例如使用 ,则可能是错误的mknod
(看man mknod。)

因此,如果您的测试文件如名称所暗示的那样,那么它们只是简单的普通(常规)文件。

你在找什么?

有一种方法可以像 DOSish 操作系统一样区分文本文件和二进制文件吗?

这是 CP/M 时代甚至更早的时代的遗迹。文件系统确实以块为单位跟踪文件大小,因此文本文件需要文件结尾字符来标记有效文本的结尾。

结果是,二进制文件和文本文件的串联必须以不同的方式进行。

Unixish 文件系统以块和实际使用的字节为单位跟踪文件的大小,因此不需要使用特殊的结束字符来标记文本结束。

如果你想猜测文件里面有什么,可以使用以下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

哈!

相关内容