Como definir metadados de "data de adição" no Mac OS X 10.7 Lion

22

O Finder no Mac OS X 10.7 Lion mostra um novo metadado de arquivo, "Data de adição", que rastreia a data em que um item foi adicionado a uma pasta. Após a atualização para 10.7, nenhum dos itens da minha ~/Downloadspasta possui valores "Data de adição". Gostaria de definir todos os valores vazios de "Data de adição" para corresponder aos valores de "Data de modificação", mas não consigo descobrir como definir o atributo "Data de adição" para um valor específico.

Meu primeiro palpite foi este:

xattr -w com.apple.metadata:kMDItemDateAdded "2012-02-19 16:34:47 +0000" myfile

Mas isso não parece funcionar (embora também não relate um erro).

John Siracusa
fonte
Você acabou encontrando uma solução?
Erotsppa 15/10
1
A resposta aceita funcionou quando eu tentei (por mais louco que seja).
John Siracusa

Respostas:

7

OK, nova abordagem aqui. Cuidado: não tenho um sistema atualizado para o Lion (meu computador veio com o Lion instalado), portanto não posso testar isso. Código não testado; faça backup antes de tentar este código!

Minha resposta anterior foi baseada na ordem de classificação usada pela pilha de Downloads no Dock. O campo Data de adição no Finder parece ser baseado nas informações do Spotlight, que são difíceis de invadir. Também não é acessível via AppleScript. Mas, parece haver uma solução alternativa.

  1. Crie um novo fluxo de trabalho no Automator.

  2. Defina o fluxo de trabalho para aceitar arquivos ou pastas do Finder adicionando a ação "Solicitar itens do Finder".

  3. Faça com que o fluxo de trabalho execute um AppleScript adicionando a ação "Executar AppleScript".

Use este AppleScript:

on run {input, parameters}
    do shell script "sudo /usr/sbin/systemsetup -setusingnetworktime Off" with administrator privileges
    tell application "Finder"
        repeat with x in input
            set myfile to POSIX path of x
            set nm to name of x
            set d to modification date of x
            set yr to (character 3 of (year of d as string)) & (character 4 of (year of d as string))
            set mth to (month of d as number) as string
            if length of mth is 1 then set mth to "0" & mth
            set dy to day of d as string
            if length of dy is 1 then set dy to "0" & dy
            set h to hours of d as string
            if length of h is 1 then set h to "0" & h
            set m to minutes of d as string
            if length of m is 1 then set m to "0" & m
            set s to seconds of d as string
            if length of s is 1 then set s to "0" & s
            set dt to mth & ":" & dy & ":" & yr as string
            set tm to h & ":" & m & ":" & s as string
            do shell script "sudo /usr/sbin/systemsetup -setdate '" & dt & "'" with administrator privileges
            do shell script "sudo /usr/sbin/systemsetup -settime '" & tm & "'" with administrator privileges
            do shell script "mv \"" & myfile & "\" /var/tmp/clobber"
            do shell script "mv /var/tmp/clobber \"" & myfile & "\""
        end repeat
    end tell
    do shell script "sudo /usr/sbin/systemsetup -setusingnetworktime On" with administrator privileges
    return input
end run

Selecione os arquivos que ainda não possuem uma Data de adição (classifique por Data de adição no Finder, selecione a parte da lista sem uma Data de adição) e execute este serviço.

captura de tela do fluxo de trabalho no Automator

Daniel
fonte
2
Isso é horrível ... de uma maneira boa, talvez?
John Siracusa
1
Bem, é definitivamente um hack. Mas parece que uma determinada parte dos metadados é computada no Spotlight e, sem invadir o mistério sombrio conhecido como /.Spotlight-V100, isso pode ser o melhor possível. Mas eu amo ver uma resposta limpa.
Daniel
Estou recebendo um erro estranho desse script? sh: -c linha 0: EOF inesperado ao procurar por correspondência ""
erotsppa 15/10
@erotsppa, ele deve ser corrigido e atualizado agora.
Daniel
O AppleScript parou com um erro ao processar um arquivo que tinha $seu nome, mas eu trabalhei com isso renomeando temporariamente esse arquivo. Para fazer o AppleScript lidar com esses arquivos, minhas pesquisas indicam que você poderia substituir myfilecom quoted form of myfile, mas eu não testei isso. Se alguém tentar isso, pode ser mais claro fazer a citação ao definir myfilee renomear a variável como quotedFilePath.
Rory O'Kane
7

Quando executo xattr -litens na minha pasta Downloads, recebo um campo parecido com o seguinte:

com.apple.metadata:kMDItemDownloadedDate:
00000000  62 70 6C 69 73 74 30 30 A1 01 33 41 B4 83 4D BF  |bplist00..3A..M.|
00000010  4C 4F E3 08 0A 00 00 00 00 00 00 01 01 00 00 00  |LO..............|
00000020  00 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00  |................|
00000030  00 00 00 00 13                                   |.....|
00000035

Este é um argumento binário. Quando uso o HexFiend para criar um arquivo com esses bytes (sim, eu os inseri manualmente; exploda do passado como inserir código assembler de uma revista na minha Apple] [GS) e salve-o como um arquivo .plist, abri o arquivo no TextWrangler e obteve o seguinte xml descompilado:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
    <date>2011-11-28T05:03:59Z</date>
</array>
</plist>

Dito isto, enquanto a Apple parece armazenar as datas em XML compilado, o texto sem formatação parece funcionar.

Em outras palavras, se você pode obter a data modificada do arquivo na forma de sequência, pode executar o comando xattr -w com.apple.metadata:kMDItemDownloadedDate "2012-02-19 16:34:47 +0000" filepara alterar a "data do download", que parece ser o campo realmente classificado, não a Data Real Adicionada.

Finalmente, você não encontrou nenhum erro ao adicionar o kMDItemDateAddedcampo (não utilizado) porque, como aprendi neste artigo , xattrdefinirá com prazer qualquer campo de metadados que você desejar, usado ou não.

Esse é o núcleo da resposta. Vou trabalhar para escrever um AppleScript para obter a data de modificação de cada arquivo, verificar se kMDItemDownloadedDateestá definido e, se não estiver, defina kMDItemDownloadedDate como a data de modificação, mas eu queria publicar o núcleo da resposta.

Daniel
fonte
1
Execute mdls nos arquivos da pasta Downloads e você verá os valores kMDItemDateAdded. É o que mostra a coluna "Data de adição" na exibição da lista do localizador.
John Siracusa
Aliás, se você quiser mostrar o kMDItemDownloadedDate como informações completas sem passar pelo HexFiend e TextWrangler, tente xattr -p com.apple.metadata:kMDItemDownloadedDate FILENAME_HERE | xxd -r -p | plutil -convert xml1 - -o -. O xxd converte em dados binários plist, depois plutilconverte em XML plist e os imprime.
Matt Gibson
OK, estou louca, tenho medo de dizer. kMDItemDateAdded não está listado xattr -le kMDItemDownloadedDate não está listado mdls. Curioso e curioso. O campo Data de adição também não é armazenado em um xattr para o diretório . Onde esses metadados moram?
Daniel
1
Como xattré um script python, acho que deve ser possível investigar esse script e descobrir como obter os dados binários do atributo em binário, em vez de hexadecimal, para que você possa alimentá-lo diretamente plutil.
Harald Hanche-Olsen
4

Não consigo encontrar uma maneira de definir a "Data de adição" mostrada no Finder.

Acredito que você esteja certo de que ele é recuperado do kMDItemDateAddedatributo de metadados do índice Spotlight . No entanto, o Spotlight parece derivar isso de alguma maneira.

Tentei configurar um atributo de arquivo estendido chamado com.apple.metadata:kMDItemDateAddedpara um valor de data em um dos vários formatos diferentes, incluindo o formato usado por kMDItemDateAddede nenhum deles foi escolhido pelo índice Spotlight, ou seja, independentemente do valor mostrado xattr, o valor mostrado por mdlsnão foi alterado.

Eu acho que , embora eu não sei ao certo, que o Spotlight simplesmente define esta data com base na primeira vez que os índices de um arquivo em um local particular, e não verifica quaisquer outros metadados, a fim de gerá-lo. Se você tiver mvum arquivo fora de Downloads e voltar a entrar, a Data de Atualização é atualizada para quando foi movido novamente, mas nenhum dos metadados do arquivo parece afetado, apenas os metadados do Spotlight.

Portanto, em resumo, acho que o Date Added é armazenado apenas em algum lugar no interior de /.Spotlight-V100, e, a menos que alguém possa sugerir ao Spotlight que atualize uma entrada de metadados para um valor arbitrário, eu posso ' Não vejo uma maneira de fazer isso.

Matt Gibson
fonte
Holofote! Bem feito.
Daniel
4

Obrigado a Daniel Lawson pela solução! Ainda funciona bem, mesmo dois anos depois.

Eu tenho duas adições:

1) Observe que há um pequeno erro no código da resposta aceita.

Está linha:

do shell script "/usr/sbin/systemsetup -settime ''" & tm & "'"

... tem um apóstrofo extra, acionando um erro "EOF inesperado". Deve ler-se:

do shell script "/usr/sbin/systemsetup -settime '" & tm & "'"

2) Mais importante, a partir do Mavericks 10.9.2, a configuração do sistema requer direitos de administrador. Portanto, toda chamada para shell script deve seguir esta fórmula:

do shell script "sudo /usr/sbin/systemsetup -setusingnetworktime Off" with administrator privileges

Aqui está a versão totalmente modificada do AppleScript, confirmada para o trabalho em 10.9.3:

on run {input, parameters}
    do shell script "sudo /usr/sbin/systemsetup -setusingnetworktime Off" with administrator privileges

    tell application "Finder"
        repeat with x in input
            set myfile to POSIX path of x
            set nm to name of x

            set d to modification date of x
            set yr to (character 3 of (year of d as string)) & (character 4 of (year of d as string))
            set mth to (month of d as number) as string
            if length of mth is 1 then set mth to "0" & mth
            set dy to day of d as string
            if length of dy is 1 then set dy to "0" & dy
            set h to hours of d as string
            if length of h is 1 then set h to "0" & h
            set m to minutes of d as string
            if length of m is 1 then set m to "0" & m
            set s to seconds of d as string
            if length of s is 1 then set s to "0" & s

            set dt to mth & ":" & dy & ":" & yr as string
            set tm to h & ":" & m & ":" & s as string
            do shell script "sudo /usr/sbin/systemsetup -setdate '" & dt & "'" with administrator privileges
            do shell script "sudo /usr/sbin/systemsetup -settime '" & tm & "'" with administrator privileges

            do shell script "mv \"" & myfile & "\" /var/tmp/clobber"
            do shell script "mv /var/tmp/clobber \"" & myfile & "\""
        end repeat
    end tell

    do shell script "sudo /usr/sbin/systemsetup -setusingnetworktime On" with administrator privileges

    return input
end run
John Keller
fonte
1
Bem-vindo ao perguntar diferente! Em vez de escrever uma resposta a resposta de edição de outra pessoa, basta clicar no editar ou melhorar esta resposta botão abaixo do post que você deseja melhorar .
grg
A resposta de Daniel tem sido editado para incluir essas mudanças.
Rory O'Kane