Preciso encontrar o horário de criação de um arquivo. Quando li alguns artigos sobre esse problema, todos mencionaram que não há solução (como Site1 , Site2 ).
Quando tentei o stat
comando, ele afirma Birth: -
.
Então, como posso encontrar o horário de criação de um arquivo?
filesystem
metadata
stat
nux
fonte
fonte
Respostas:
Existe uma maneira de saber a data de criação de um diretório, basta seguir estas etapas:
Conheça o inode do diretório por
ls -i
comando (digamos, por exemplo, seu X )Saiba em qual partição seu diretório é salvo por
df -T /path
comando (digamos que esteja ativado/dev/sda1
)Agora use este comando:
sudo debugfs -R 'stat <X>' /dev/sda1
Você verá na saída:
crtime é a data de criação do seu arquivo.
O que eu testei :
Modificado, criando um arquivo.
Eu tentei o comando e deu um tempo exato.
fonte
debugfs
extrai-o diretamente do sistema de arquivos para que não precise usar a API do kernel. Veja aqui .statx()
O @Nux encontrou uma ótima solução para isso, que todos deveriam votar. Decidi escrever uma pequena função que pode ser usada para executar tudo diretamente. Basta adicionar isso ao seu
~/.bashrc
.Agora, você pode executar
get_crtime
para imprimir as datas de criação de quantos arquivos ou diretórios desejar:fonte
cp -p
ou similar.df
não parece suportar a--output
opção. Nesse caso, você pode substituir essa linha porfs=$(df foo | awk '{a=$1}END{print a}'
e a função também funcionará. Tudo o que estou mostrando nesta resposta é uma maneira de agrupar o comando da resposta aceita de uma maneira que possa ser executada diretamente para destinos de arquivo / diretório.A incapacidade de
stat
mostrar o tempo de criação é devido à limitação dastat(2)
chamada do sistema , cuja estrutura de retorno não incluiu um campo para o tempo de criação. A partir do Linux 4.11 (ou seja, 17.10 e mais recente *), no entanto, a novastatx(2)
chamada do sistema está disponível, o que inclui um tempo de criação em sua estrutura de retorno.* E possivelmente em versões mais antigas do LTS usando os kernels da pilha de habilitação de hardware (HWE). Verifique
uname -r
se você está usando um kernel pelo menos em 4.11 para confirmar.Infelizmente, não é fácil fazer chamadas do sistema diretamente em um programa C. Normalmente, a glibc fornece um wrapper que facilita o trabalho, mas a glibc adicionou um wrapper apenas
statx(2)
em agosto de 2018 (versão 2.28 , disponível em 18.10). Felizmente, o @whotwagner escreveu um programa C de amostra que mostra como usar astatx(2)
chamada do sistema nos sistemas x86 e x86-64. Sua saída é do mesmo formato questat
o padrão, sem nenhuma opção de formatação, mas é simples modificá-la para imprimir apenas a hora do nascimento.Primeiro, clone-o:
Você pode compilar o
statx.c
código ou, se desejar apenas a hora do nascimento, criar umbirth.c
no diretório clonado com o seguinte código (que é uma versão mínima dastatx.c
impressão, apenas o carimbo de data / hora da criação, incluindo precisão de nanossegundos):Então:
Em teoria, isso deve tornar o tempo de criação mais acessível:
debugfs
é uma ferramenta para sistemas de arquivos ext2 / 3/4 e inutilizável em outros)make
elinux-libc-dev
).Testando um sistema xfs, por exemplo:
No entanto, isso não funcionou para NTFS e exfat. Eu acho que os sistemas de arquivos FUSE para aqueles não incluíram o tempo de criação.
Se, ou melhor, quando, o glibc adicionar suporte à
statx(2)
chamada do sistema,stat
seguirá em breve e poderemos usar ostat
comando antigo simples para isso. Mas acho que isso não será suportado nos lançamentos do LTS, mesmo que eles tenham novos kernels. Portanto, não espero questat
em nenhuma versão atual do LTS (14.04, 16.04 ou 18.04) imprima o tempo de criação sem intervenção manual.No 18.10, no entanto, você pode usar diretamente a
statx
função conforme descrito emman 2 statx
(observe que a página de manual 18.10 está incorreta ao afirmar que a glibc ainda não adicionou o wrapper).fonte
1
?TL; DR: Basta executar:
sudo debugfs -R 'stat /path/to/your/file' /dev/<your fs>
(Para descobrir seu fs, corra
df -T /path/to/your/file
, provavelmente será/dev/sda1
).Versão longa:
Vamos executar dois comandos:
Descubra o nome do nome da partição para o seu arquivo.
A saída ficará assim (o nome da partição é o primeiro):
Descubra o tempo de criação para esse arquivo.
Na saída, procure
ctime
.fonte