나는 (파일 관리자 유형 응용 프로그램에서) 디렉토리의 각 파일이 어떤 유형의 파일인지에 대한 가장 관련성이 높은 자연어 설명을 제공하기 위해 찾고 있습니다. 중복되는 장점을 가지고 작업의 일부를 수행하는 여러 명령줄 메커니즘이 있는 것으로 보입니다. 비교적 일반적인 몇 가지 테스트 사례에서 이들의 동작을 살펴보겠습니다. (-b 옵션은 이 예제에서 파일 이름이 반복적으로 인쇄되지 않도록 하기 위한 것입니다.)
- ssh-keygen이 생성한 공개 키(파일 이름 선택):
~> file -b xgl_ed25519.pub
OpenSSH ED25519 public key
~> mimetype -d -b xgl_ed25519.pub
Microsoft Publisher document
~> mimetype -d -M -b xgl_ed25519.pub # -M = "ignore extension"
plain text document
문서는 정확하고 mimetype은 매우 혼란스럽고 mimetype -M은 정확하지만 도움이 되지 않을 만큼 구체적이지 않습니다.
- 필기 마크다운 파일:
Notes> file -b servers.md
Nim source code, Unicode text, UTF-8 text, with very long lines (5244)
Notes> mimetype -d -b servers.md
Markdown document
Notes> mimetype -d -M -b servers.md
plain text document
문서는 매우 혼란스럽고 mimetype은 정확하며 mimetype -M은 정확하지만 별로 도움이 되지 않습니다.
- 우연히 비표준 확장자를 가진 JPEG 파일을 받았습니다:
GVIP> file -b example.img
JPEG image data, JFIF standard 1.01, aspect ratio, density 1x1, segment length 16, baseline, precision 8, 960x720, components 3
GVIP> GVIP> mimetype -d -b example.img
Raw disk image
GVIP> mimetype -d -M -b example.img
JPEG image
여기에 있는 문서는 정확하지만 매우 장황하고 mimetype이 혼란스럽고 mimetype -M이 정확합니다.
이 예제의 요점은 각 접근 방식이 사용자에게 제시하고 싶은 최상의/가장 실용적인 답변을 제공하는 다양한 예제를 상대적으로 자주 접한다는 것입니다. 그러나 사용자 입장에서 파일의 좋은 특성을 판단하는 것은 분명 상당한 관심을 받아온 문제이다. 결국 대부분의 파일 관리자에는 "유형" 필드가 있습니다. (예를 들어 로고가 없는 MIME 타자기도 있다는 것을 알고 있습니다. file -i
그러나 MIME 유형은 매우 장황하고 사용자 친화적이지 않습니다. 자연어 설명을 찾고 있는데 여전히 문제가 있습니다. 확장 프로그램을 신뢰할지 여부를 알 수 있습니다.)mimetype
xdg-mime query filetype
따라서 문제는 파일 형식의 유용하고 정확하며 특정 특성을 얻는 가장 안정적인 방법은 무엇입니까? 나는 "try"와 같은 논리를 짜맞추고 싶지 않습니다. file
짧고 구체적인 결과가 나오면 이렇게 하고, 그렇지 않은 경우 플래그 mimetype
유무를 비교 -M
하고 결과에 따라 어느 것을 신뢰할지 결정합니다. -M 없이 -M과 호환되지만 -M보다 더 구체적이면 이를 사용하고, 그렇지 않으면 -M 응답을 사용하십시오." (솔직히 "mimetype"은 거의 사용되지 않는 Perl 언어에 대한 종속성을 도입하기 때문에 전혀 사용하고 싶지 않습니다. 데이터베이스의 mimetype 설명에 액세스하는 보다 현대적인 방법이 있습니까?)
어쨌든, 일반적인 파일 특성 문제에 대해서는 명령줄 솔루션에만 국한되지 않고, 비교적 일반적인 현재 언어와 이에 적합한 라이브러리가 있다면 그것을 사용할 수도 있습니다. 어떤 안내에도 감사드립니다.
답변1
나는 이 답변을 결코 받아들이지 않을 것입니다. 단지 현재 사용하고 있는 일시적인 혐오감을 공유해야겠다고 생각했습니다. 느리고 거칠지만 매우 유용한 결과를 만들어내는 것 같습니다. 길이가 0인 파일의 경우 "빈" 파일 형식을 생성하는 것이 마음에 듭니다. 이 작업을 수행하는 파일 관리자는 본 적이 없습니다.
신속한 프로토타입이므로 xonsh 스크립트 형식을 취합니다. xonsh에 익숙하지 않다면 이 경우 $(blah bloo)
명령의 출력을 캡처하기 위한 매우 편리한 구문을 사용하는 Python이라고 가정할 수 있습니다 blah bloo
.
#!/usr/bin/env xonsh
import re
filesez = $(file -b $ARG1)
filesez = filesez.strip()
# file is very good at detecting scripts:
script = re.search(r'\w*\s*script', filesez)
if script:
print(script.group())
exit(0)
# If file said anything complicated, we'll try mimetype
punctuation = re.search(r'[,;]', filesez)
# For text files, assume the extension is right
trust = (filesez == 'ASCII text')
if not (punctuation or trust):
print(filesez)
exit(0)
# OK, didn't get enough info from file, try mimetype
# Use a format that gives both the mime type and
# the description at once, to save calls
oformat = r'--output-format=%m|%d'
mimewith = $(mimetype @(oformat) $ARG1)
[mimetypewith, descwith] = mimewith.strip().split('|')
# Usually we go with the extension
desc = descwith
# And we always do with text files, as mentioned above
trust = (trust or 'Unicode text' in filesez)
if not trust:
mimewithout = $(mimetype -M @(oformat) $ARG1)
[mimetypewithout, descwithout] = mimewithout.strip().split('|')
if mimetypewith.split('/')[0] == mimetypewithout.split('/')[0]:
# If the types are compatible, believe the extension
desc = descwith
else:
desc = descwithout
# Calling everything a document is a waste of screenspace:
if desc.endswith(' document'):
desc = desc[0:-9]
# All right, we've done the best we can:
print(desc)
더 나은 답변이 있으면 게시해 주세요. 이 문제를 정리하고 싶습니다.