콘텐츠를 기반으로 파일의 확장자를 어떻게 얻을 수 있나요?

콘텐츠를 기반으로 파일의 확장자를 어떻게 얻을 수 있나요?

확장자가 제공되지 않는 웹사이트에서 여러 이미지를 다운로드할 계획이므로 파일의 내용이나 MIME 유형을 기반으로 이미지를 추가하고 싶습니다.

file <filename>파일 형식을 식별하는 데는 큰 도움이 되지만 확장자가 필요합니다.

--extension
      Print a slash-separated list of valid extensions for the file type found.

이것은 의 file매뉴얼 페이지에 있지만 작동하지 않는 것 같습니다.

$ file --extension test_text_file.txt
test_text_file.txt: ???

$ file --extension test_png_file.png
test_png_file.png: ???

$ file --extension test_gif_file.gif
test_gif_file.gif: ???

???문자 그대로 내가 전달한 모든 파일에 대해 인쇄합니다. 심지어 이미 적절한 확장명이 있는 파일도 인쇄합니다 . 이들 모두는 해당 유형의 유효한 파일 file이며 --extension.

이 기능이 작동하지 않는 이유는 무엇 file --extension이며 파일 확장자를 얻으려면 무엇을 사용할 수 있습니까?

아이디어는 file --mime-type알려진 MIME 유형을 해당 확장에 매핑하는 디스패치 테이블 배열을 사용하고 생성하는 것이지만 더 간단하고 안전한 솔루션을 선호합니다.

답변1

file --extension나에게 효과가 없습니까?

당신뿐만 아니라. 보다이 질문. 거기 댓글 중 하나가 맞는 것 같습니다.

어쩌면 아주 아주 불완전한 기능일까요?

변환을 수행하는 표준 Unix 도구를 찾지 못했기 때문에 어쨌든 귀하의 아이디어가 가장 쉬운 솔루션일 수 있습니다.

아이디어는 file --mime-type알려진 MIME 유형을 해당 확장에 매핑하는 디스패치 테이블 배열을 사용하고 생성하는 것이지만 더 간단하고 안전한 솔루션을 선호합니다.

그러한 지도가 존재한다는 점에 유의하세요 /etc/mime.types. 보다Unix 및 Linux SE에 대한 또 다른 질문입니다.. 답변 중 하나를 바탕으로 다음 기능을 생각해 냈습니다.

function getext() {
   [ "$#" != 1 ] && { echo "Wrong number of arguments. Provide exactly one." >&2; return 254; }
   [ -r "$1" ] || { echo "Not a file, nonexistent or unreadable." >&2; return 1; }
   grep "^$(file -b --mime-type "$1")"$'\t' /etc/mime.types |
      awk -F '\t+' '{print $2}'
}

용법:

getext test_text_file.txt   # it takes just one argument

필요에 맞게 조정하고 스크립트 등으로 만드십시오. 주요 관심사는 다음과 같습니다.

  • 성공하면(종료 상태 0) 출력은 비어 있지 않거나 비어 있을 수 있습니다(심지어 \n).
  • 일부 MIME 유형은 두 개 이상의 확장자를 반환합니다. 최대 하나를 얻는 데 사용할 수 있지만 cut -d ' ' -f 1원하는 것이 아닐 수도 있습니다.
  • 따라서 대신 사용자 정의 지도 파일이 /etc/mime.types유용할 수 있습니다. 이 명령은 현재 디렉터리(및 하위 디렉터리)에 어떤 MIME 유형이 있는지 표시합니다.

    find . -type f -exec file -b --mime-type {} + | sort | uniq
    
  • grep두 번 이상 일치하면 안 됩니다(적어도 와 함께 /etc/mime.types). ^(줄 시작) 및 $'\t'(탭)은 부분 일치를 피하기 위해 존재합니다. grep -m 1 ...(또는 그 이후)를 사용하면 head -n 1최대 한 줄만 얻을 수 있습니다.

답변2

제 생각에 언급할 가치가 있는 것은 몇 가지 파일 형식에 대한 확장자를 표시한다는 것입니다.

file --preserve-date --special-files --extension *

결과:

BMP_file:          ???
CPP_file:          ???
FIFO_file:         ERROR: (null)
GZ_file:           ???
HAR_file:          ???
H_file:            ???
HTML_file:         ???
JAR_file:          zip/cbz
JAVA_CLASS_file:   ???
JAVA_JAVA_file:    ???
JPG_file:          jpeg/jpg/jpe/jfif
MKV_file:          ???
MP3_file:          ???
MP4_file:          ???
ODT_file:          ???
PDF_file:          ???
PNG_file:          ???
PPS_file:          ???
SHELL_SCRIPT_file: ???
SO_file:           ???
TIFF_file:         ???
TMP_file_GBQcW:    ???
XML_file:          ???
ZIP_file:          zip/cbz

관련 정보