내 작업 디렉터리에 다음 두 파일이 있습니다.
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
하아!