이 file
명령은 내 필요에 따라 파일 형식을 결정하는 데 유용합니다. 이러한 결과를 기존 파일 확장자로 매핑할 수 있는 방법이 있습니까?
답변1
시스템에 등록된 파일 확장자는 이어야 합니다 /etc/mime.types
. 따라서 출력에서 파일 형식을 file
이라는 변수로 추출한다고 가정하면 type
다음과 같이 간단히 수행할 수 있습니다.
grep -i "$type" /etc/mime.types | awk '{$1="";print $0}'
또는 (주석에서 제안한 200_success와 같이) awk
이것을 단독으로 사용할 수 있습니다.
awk -v IGNORECASE=1 '/ENVIRON["type"]/{$1="";print $0}'
예
$ type=Perl
$ grep -i "$type" /etc/mime.types | awk '{$1="";print $0}'
pl pm
답변2
이것은 @hildred와 동일한 기본 아이디어입니다.답변그러나 더 간단한 방법( gawk
)을 사용하고 공백이 포함된 파일 이름과 알 수 없는 파일 형식을 처리하도록 수정하세요.
셸의 초기화 파일에 다음 줄을 추가합니다( ~/.bashrc
예: 실행 중인 경우 bash
).
get_ext(){
for f in "$@"; do
type='unknown extension';
foo=$(grep -w "$(file --mime-type "$f" | awk '{print $NF}')" /etc/mime.types |
awk -F"\t" 'NF>1{print $NF}')
[ -n "$foo" ] && type="$foo";
printf "%s\t%s\n" "$f" "$type";
done
}
이제 다음과 같이 실행할 수 있습니다.
$ get_ext *
cp unknown extension
file with spaces .jpg jpeg jpg jpe
foo.pl pl pm
foo.png png
foo.py py
foo.txt asc txt text pot brf srt
/etc/mime.types
연결된 확장자가 없는 파일(예: cp
실행 파일)의 경우 "알 수 없는 확장자"를 반환합니다.
답변3
첫 번째 확장이 정확하다고 가정하고 흥미로운 문자를 다루지 않는 개념 증명입니다.
file --mime-type -N *|sed \
-e 's!^\(.*: \)\(.*\)$!echo \1;grep -e \2 /etc/mime.types!e' \
-e 's!\n.*/[^ ]\+[ ]\+\([^ ]\+\).*! \1!' \
-e 's!\n\(.*/[^ ]\)\+!\1!'