Converter extensão de nome de arquivo para UTI

6

Como você pode converter uma string de extensão de nome de arquivo (como png ) em um Identificador de tipo uniforme (como public.png )?

Estou procurando um script ou utilitário de uso geral, nada parecido com mdls -name kMDItemContentTypeTree <file> .

    
por user495470 17.06.2011 / 09:24

4 respostas

5

A maneira mais fácil de fazer isso é usar UTTypeCreatePreferredIdentifierForTag() :

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    NSArray *args = [[NSProcessInfo processInfo] arguments];

    if ([args count] < 2) {
        printf("usage:\n");
        printf("uti <filenameExtension>\n");
        exit(EXIT_SUCCESS);
    }

    NSArray *extensions = [args
                 subarrayWithRange:NSMakeRange(1, [args count] - 1)];

    for (NSString *filenameExtension in extensions) {
        NSString *utiType = (NSString *)UTTypeCreatePreferredIdentifierForTag(
                              kUTTagClassFilenameExtension,
                           (CFStringRef)filenameExtension, NULL);

        printf("%s\n", [utiType UTF8String]);
        [(NSString *)utiType release];
    }

    [pool drain];
    return 0;
}

Executável uti compilado e código-fonte: uti.zip

Uso:

MacPro:~ mdouma46$ /Users/mdouma46/Developer/uti/uti png tga mov sdfad
public.png
com.truevision.tga-image
com.apple.quicktime-movie
dyn.age81g3dgqfwa

(extensões de arquivo "desconhecidas" são mapeadas para UTIs que começam com o prefixo dyn. ).

    
por 18.06.2011 / 01:53
3

Caso isso seja principalmente sobre conveniência (estou disposto a excluir embora):

#!/usr/bin/env bash

if [ $# = 0 ] ; then
        echo "Fail param"
        exit 1
fi

ext=$1
export TMPDIR=$HOME/Library
t=$( mktemp -t getuti.XXXXXX )

if [ $? != 0 ] ; then
        echo "Fail mktemp"
        exit 1
fi

mv $t $t.$ext

if [ $? != 0 ] ; then
        echo "Fail mv"
        exit 1
fi

while true ;
do
        uti=$( mdls -name kMDItemContentTypeTree -raw -nullMarker $t $t.$ext )
        if [ "$uti" = "${uti//$t/}" ] ; then
                echo "$uti"
                rm -f $t.$ext
                exit 0
        fi
        sleep 1
done

Uso:

$ ./getuti.sh jpeg
(
    "public.jpeg",
    "public.image",
    "public.data",
    "public.item",
    "public.content"
)
$ ./getuti.sh gif
(
    "com.compuserve.gif",
    "public.image",
    "public.data",
    "public.item",
    "public.content"
)
$ ./getuti.sh mdown
(
    "net.daringfireball.markdown",
    "public.text",
    "public.data",
    "public.item",
    "public.content"
)
$ ./getuti.sh foobarbazqux
(
    "public.data",
    "public.item"
)
    
por 17.06.2011 / 19:46
2

getuti

if [[ $# == 0 ]]; then
    echo "Usage: getuti extension ..."
    exit 1
fi
for x in $@; do
    f="/tmp/me.lri.getuti.$x"
    touch "$f"
    mdimport "$f"
    mdls -name kMDItemContentType "$f" | sed 's|.*"\(.*\)"||'
    rm "$f"
done

Uso

$ getuti png pngooo
public.png
dyn.ah62d4rv4ge81a5xhr7108
    
por 12.10.2011 / 15:07
0

A partir da versão 1.5.2, duti (instalação via Homebrew : brew install duti ) suporta a opção -e - não documentada a partir de 1.5.2 - que recupera a declaração UTI associada a uma extensão de nome de arquivo especificada:

duti -e .png

produz, por exemplo:

identifier: public.png
description: Portable Network Graphics image
declaration: {
    UTTypeIdentifier = public.png
    UTTypeDescription = Portable Network Graphics image
    UTTypeConformsTo = public.image
    UTTypeTagSpecification = {
        com.apple.ostype = PNGf
        public.mime-type = image/png
        com.apple.nspboard-type = Apple PNG pasteboard type
        public.filename-extension = png
    }
}

Assim, para recuperar apenas a UTI da extensão .png , use:

duti -e .png | awk '{ print $2; exit }' # -> 'public.png'
    
por 07.09.2014 / 04:22

Tags