문자 특수 파일 및 블록 특수 파일의 존재 여부를 테스트하기 위한 쉘 스크립트

문자 특수 파일 및 블록 특수 파일의 존재 여부를 테스트하기 위한 쉘 스크립트

내 작업 디렉터리에 다음 두 파일이 있습니다.

test.txt그리고img.jpg

test.txt캐릭터 특수 파일입니다

img.jpg블록 특수 파일입니다

이제 쉘 스크립트를 사용하여 이 파일들이 문자 특수 파일인지 블록 특수 파일인지 확인하고 싶습니다.

나는 다음 두 가지 쉘 스크립트를 작성했습니다.

첫 번째-

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

하아!

관련 정보