Como obtenho a data de criação de um arquivo em um volume lógico NTFS?

9

Criei um volume lógico NTFS no meu sistema Linux para armazenamento de arquivos do Windows porque quero manter a data de criação dos meus arquivos (provavelmente os compactaria em um arquivo e os descompactaria, embora não tenha idéia se isso funcionaria). O NTFS-3G salva a data de criação dos arquivos no Linux? Se sim, como faço para acessá-lo?

Lendo este encadeamento , o OP vincula a documentação no NTFS que fornece um script de shell para encontrar a data de criação. Modifiquei-o na tentativa de obter os segundos do valor hexadecimal, mas acredito que estou fazendo algo errado:

#!/bin/sh
CRTIME=`getfattr -h -e hex -n system.ntfs_times $1 | \
    grep '=' | sed -e 's/^.*=\(0x................\).*$/\1/'`
SECONDS=$(($CRTIME / 10000000))
echo `date --date=$SECONDS`
NobleUplift
fonte

Respostas:

6

Em https://www.tuxera.com/community/ntfs-3g-advanced/extended-attributes/#filetimes ,

Um arquivo NTFS é qualificado por um conjunto de quatro registros de data e hora “representando o número de intervalos de 100 nanossegundos desde 1º de janeiro de 1601 (UTC)”, embora o UTC não tenha sido definido por anos antes de 1961 devido a variações desconhecidas da rotação da Terra.

Você encontrará ainda mais informações, incluindo:

Novas versões do NTFS-3G expor um ntfs.ntfs_crtimee ntfs.ntfs_crtime_beatributo.

Assim:

getfattr --only-values -n system.ntfs_crtime_be /some/file |
  perl -MPOSIX -0777 -ne '$t = unpack("Q>");
  print ctime $t/10000000-11644473600'

Veja também:

ntfsinfo -F /file/in/ntfs /dev/fs-device

Com o ntfs-3g mais antigo, isso deve funcionar:

getfattr --only-values -n system.ntfs_times /some/file |
  perl -MPOSIX -0777 -ne 'print ctime unpack(Q)/10000000-11644473600'

Ou com ferramentas GNU e precisão de sub-segundo:

date '+%F %T.%N' -d "@$({ echo 7k
  getfattr --only-values -n system.ntfs_times /some/file |
    od -A n -N 8 -vt u8; echo '10000000/ 11644473600-p'; } |dc)"
Stéphane Chazelas
fonte
Ah, na verdade eu estava subtraindo 11.644.473.600 depois que postei essa pergunta, mas como os intervalos de 100 nanossegundos estavam errados, estava resultando em um resultado inválido. Vou testar isso quando voltar para minha caixa.
NobleUplift
Funcionou! Obrigado. Como unpack("Q>")funciona? Eu li o documento Perl e não o entendo completamente.
NobleUplift
1
@NobleUplift, descompacta um grande endian (>) [Q] UAD (inteiro de 64 bits)
Stéphane Chazelas