Bash 스크립트: 파일이 텍스트 파일인지 확인하세요.

Bash 스크립트: 파일이 텍스트 파일인지 확인하세요.

저는 메뉴 기반 bash 스크립트를 작성 중이며 메뉴 옵션 중 하나는 텍스트 파일 첨부가 포함된 이메일을 보내는 것입니다. 내 파일이 텍스트 파일인지 확인할 수 없습니다. 이것이 내가 가진 것입니다:

fileExists=10
until [ $fileExists -eq 9 ]
do
  echo "Please enter the name of the file you want to attach: "
  read attachment
  isFile=$(file $attachment | cut -d\ -f2)
  if [[ $isFile = "ASCII" ]]
    then
      fileExists=0
    else
      echo "$attachment is not a text file, please use a different file"
  fi
done

오류가 계속 발생합니다. 구분 기호는 단일 문자여야 합니다.

답변1

  1. file $attachment 대신 이라는 사실로 판단하면 file "$attachment"귀하의 스크립트가 공백이 포함된 파일 이름을 처리할 수 없는 것 같습니다. 그러나 파일 이름에는 공백이 포함될 수 있으며 잘 작성된 스크립트를 사용하면 이를 처리할 수 있습니다. 그런 다음 참고하세요:

    $ file "foo bar"
    foo bar:  ASCII text
    
    $ file "foo bar" | cut -d' ' -f2
    bar:
    

    널리 사용되며 적극 권장되는 방법은 파일 이름을 null로 종료하는 것입니다.

    $ file -0 "foo bar" | cut -d $'\0' -f2
    :  ASCII text
    
  2. file명령은 파일의 파일 형식에 대해 정보를 바탕으로 추측합니다. 물론 추측이 틀릴 때도 있다. 예를 들어, file때때로 일반 텍스트 파일을 보고 그것이 쉘 스크립트, C 프로그램 또는 다른 것이라고 추측합니다. 따라서 출력이 있는지 확인하고 싶지 않습니다.file ASCII text, 당신이 알고 싶은 것은설명하다파일은 텍스트 파일입니다. 매뉴얼 페이지를 보면 파일이 텍스트 파일인 경우 출력에 해당 단어가 포함된다는 file것을 알 수 있지만 . 출력에는 다음 단어가 포함됩니다 .textshell commands textfiletext

    isFile=$(file -0 "$attachment" | cut -d $'\0' -f2)
    case "$isFile" in
       (*text*)
          echo "$attachment is a text file"
          ;;
       (*)
          echo "$attachment is not a text file, please use a different file"
          ;;
    esac
    

답변2

case $(file -b --mime-type - < "$attachment") in
  (text/*)
     printf '%s\n' "$attachment is probably text according to file"
     case $(file -b --mime-encoding - < "$attachment") in
       (us-ascii) echo "and probably in ASCII encoding"
     esac
esac

답변3

. cut -d\ -f2로 변경 하면 문제가 발생합니다 .cut -d\ -f2

의 경우 cut매개변수는 다음과 같습니다.

# bash: args(){ for i; do printf '%q \\\n' "$i"; done; }
# args cut -d\ -f2
cut \
-d\ -f2 \

그것이 문제이다. \셸에서 인수 사이의 구분 기호가 아닌 공백 리터럴로 공백을 이스케이프하고 추가 공백을 추가하지 않아 전체 -d\ -f2부분이 하나의 인수로 표시됩니다. 추가 공백을 추가하여 두 개의 매개변수로 표시해야 -d\합니다 -f2.

혼란을 피하기 위해 많은 사람들이 대신 따옴표를 사용합니다 -d' '.

추신: 파일을 사용하는 것보다 차라리 파일을 사용하고 모든 것을 ASCII로 설정하고 싶습니다.

if file "$attachment2" | grep -q text$; then
    # is text
else
    # file doesn't think it's text
fi

답변4

또 다른 옵션은 정규식을 사용하지 않고 cut다음 전체 출력과 일치시키는 것입니다 file.

#...
isFile=$(file $attachment)
if [[ "$var" =~ ^[^:]*:\ ASCII ]]
#...

관련 정보