Preservar carimbo de data e hora da criação após modificação


8

Quero modificar arquivos vimsem alterar os carimbos de data e hora da criação.

Os documentos não parecem mencionar nada sobre essa possibilidade.

Eu gostaria de conseguir isso sem desativar o recurso de troca / recuperação.

Uma alternativa seria armazenar o tempo em algum lugar e substituí-lo ao sair, eu acho.


2
Em qual SO você está? Alguns SOs não armazenam tempos de criação, portanto, isso pode fazer a diferença.
blm 6/11/2015

Estou no OS X 10.8.5.
1.61803 06/11/2015

Respostas:


2

A resposta de Sato estaria correta em uma derivada padrão do Unix, onde ctimemuitas vezes é confundida com o tempo de criação, mas na verdade é o tempo de mudança do inode, e "preservar" isso realmente não faz sentido. No entanto, perguntei qual sistema operacional o pôster está usando porque o Mac OS X mantém um horário de criação separado, que é uma data e hora reais da criação, e não é atualizado modificando o arquivo no local ou alterando o modo do arquivo ou algo assim, tudo dos quais são atualizados ctime.

Você pode ver a hora da criação executando o Get Info em um arquivo no Finder ou GetFileInfo <file>em uma linha de comando ( GetFileInforequer a instalação das ferramentas do desenvolvedor). O horário pode ser modificado usando SetFile -d <datetime> <file>(também exigindo ferramentas de desenvolvedor).

Portanto, parece razoável (para mim, não sei sobre Bram :-)) pedir ao vim para manter o tempo de criação no Mac OS X, copiando o tempo de criação do arquivo original para o novo arquivo, mas claramente não e, olhando as fontes do vim, não vejo em nenhum lugar onde isso acontece. Infelizmente, parece que a resposta para a pergunta do pôster é "Atualmente não é possível". Como o Mac OS X (com ferramentas de desenvolvedor) permite obter e definir o tempo de criação na linha de comando, pode ser possível montar um script vim que faça isso, embora isso esteja atualmente atualmente além das minhas habilidades de script do vim.

Editar

Eu decidi brincar com algo de script e realmente o fiz funcionar!

Adicione o seguinte ao seu .vimrc:

autocmd BufReadPre * call SaveFileCreateTime()
autocmd BufWritePost * call RestoreFileCreateTime()

function! SaveFileCreateTime()
    let l:path = expand('%:p')

    if l:path != ''
        let b:created = system("GetFileInfo -d " . shellescape(bufname("%")))
    endif
endfunction

function! RestoreFileCreateTime()
    if exists('b:created')
        execute system(
          \ 'SetFile -d ' .
          \ shellescape(b:created) .
          \ ' ' .
          \ shellescape(bufname("%")))
    endif
endfunction

Isso define comandos automáticos para serem executados antes de um arquivo ser lido (para edição em um buffer, não para coisas do tipo :read) e depois que ele é gravado. As primeiras chamadas SaveFileCreateTimeusadas GetFileInfo -dpara obter o tempo de criação do arquivo e armazená-lo na variável local do buffer b:created. Depois que um arquivo é gravado, RestoreFileCreateTimeé chamado. Se b:createdexistir, é usado em um systemcomando SetFile -dpara definir o horário.

Aqui está um exemplo:

$ echo hello >file.txt
$ stat -c%z file.txt;GetFileInfo -d file.txt
2015-11-07 11:44:04.000000000 -0800
11/07/2015 11:44:04
$ vim file.txt
a earth<esc>:wq
$ cat file.txt
hello earth
$ stat -c%z file.txt;GetFileInfo -d file.txt
2015-11-07 11:44:24.000000000 -0800
11/07/2015 11:44:04

Você pode ver que o tempo de mudança do inode (como exibido por stat) mudou, mas o tempo de criação do arquivo (como exibido por GetFileInfo) não. Sucesso!

Como observado acima, isso requer que as ferramentas do desenvolvedor sejam instaladas para obter GetFileInfo e SetFile. Além disso, este é o meu primeiro script real, então fique à vontade para apontar todos os erros hediondos que cometi!


Um script vim seria um invólucro ou alteraria vimo tempo de execução usando essas ferramentas, que eu instalei btw, para preservar a data de criação?
1.61803 07/11

Seria algumas funções que você coloca no seu .vimrc. Eu decidi brincar com isso e realmente consegui algo que funcionasse! Vou editar minha resposta para incluir isso.
blm

@ 1.61803 Ok, editei minha resposta para incluir o vimscript para economizar e restaurar o tempo. Deixe-me saber se funciona para você.
blm 7/11

Eu testei enquanto vimdiffarquivos pertencentes ao usuário e root. Por enquanto, tudo bem. Você deve postar isso no wiki Dicas do Vim . Essa foi uma ótima resposta, obrigado.
1.61803

Btw, seu statcomando é para Linux, eu acho. No OS X 10.8.5 você usaria stat -f %Sc.
1.61803 08/11/2015


1

O que você deseja não é possível implementar no UNIX usando funções padrão do espaço do usuário. O ctimearquivo de é atualizado automaticamente pelo kernel quando o arquivo é inodealterado . Ao contrário atimee mtime, não há nenhuma função acessível ao utilizador de jogo ctimepara um valor arbitrário.


Poderia vim, em vez de trocar arquivos, apenas cp test.swp test.txt?
1.61803 07/11

@ 1.61803, less test.swpdeve responder à sua pergunta.
Romainl 7/11
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.