Como encontrar arquivos que foram criados mais recentemente no sistema de arquivos?

2

Estou tentando controlar a conclusão de um instalador silencioso, detectando a presença do último arquivo criado por ele, mas para isso eu preciso descobrir qual arquivo é. Há alguma maneira de fazer isso? Eu encontrei muitas respostas sobre como encontrar o arquivo modificado mais recentemente, mas isso não é efetivo, já que muitos desses arquivos foram modificados pelo criador original em uma ordem diferente da que foram adicionados ao arquivo original. sistema pelo instalador.

    
por Pav 17.11.2015 / 16:52

1 resposta

2

Concordando que o tempo de mudança (também conhecido como ctime ) é o recurso mais portátil que pode ser observado em um sistema de arquivos * nix, o OP pode precisar de mais detalhes.

POSIX <sys/stat.h> documenta três carimbos de hora para cada arquivo, diretório, dispositivo um sistema de arquivos: acesso , modificação e alterado . Os dois primeiros podem ser configurados com valores arbitrários usando utimes (amplamente disponível, embora marcado como um extensão), mas o último não pode. Ele é atualizado para a hora atual como um efeito colateral de muitas chamadas do sistema, incluindo utimes . É mais provável que seja atualizado por chmod , mas também mover ou renomear um arquivo também faz isso.

No entanto, se você estiver procurando por pistas sobre quando um arquivo foi criado, o ctime é uma pista tão boa quanto você provavelmente encontrará. O tempo de acesso também pode ser útil, mas alguns sistemas de arquivos podem ser configurados para evitar atualizações. Olhe primeiro em ctime .

O programa find (também documentado em POSIX) inclui uma opção para usar < em> ctime :

-ctime n
The primary shall evaluate as true if the time of last change of file status information subtracted from the initialization time, divided by 86400 (with any remainder discarded), is n.

O 86400 refere-se ao número de segundos em um dia; n é um inteiro (o número de dias). Algumas implementações de find fornecem unidades menores, mas elas não estão no POSIX.

Você poderia usá-lo assim para obter uma lista de arquivos alterados no último dia:

find . -ctime -1 -print

Algumas implementações podem permitir um valor não-inteiro para n , mas o POSIX é explícito aqui:

In the descriptions, wherever n is used as a primary argument, it shall be interpreted as a decimal integer optionally preceded by a plus ( '+' ) or minus-sign ( '-' )

Por isso, não é possível ter uma extensão compatível com POSIX nessa direção. Outras implementações podem fornecer opções alternativas que (por exemplo) especificam a diferença de tempo como um número de minutos. Você deve consultar o manual de find para o sistema que está usando, para ver se isso se aplica a você.

Um dos comentários mencionou alguns sistemas de arquivos com uma extensão (também não padrão) para obter o tempo real de criação do arquivo. Vários sistemas tiveram isso ao longo dos anos, incluindo

  • VMS (mais tarde renomeado para OpenVMS ), com criação , backup , revisão e expiração registros de data e hora.
  • Windows , com criação , acesso e modificação registros de data e hora (observando que, embora os nomes sejam semelhantes, o as regras de atualização diferem do POSIX).

Existe uma discussão mais pertinente em Como obter o arquivo data de criação no Linux? , que menciona um membro st_birthtime para a estrutura stat . Isso está documentado em páginas de manual para o OSX stat(2) e FreeBSD stat(2) , bem como no sistema específico do FreeBSD stat(1) e os utilitários stat(1) da OSX. (O NetBSD também documenta esta extensão). Chame isso de uma característica dos modernos sistemas BSD, para breve.

O utilitário find correspondente também suporta a extensão (veja, por exemplo, OSX encontrar (1) ):

all of the -B* birthtime related primaries are extensions to IEEE Std 1003.1-2001 (''POSIX.1'').

Outros sistemas não possuem essa extensão. Para discussão:

por 17.11.2015 / 23:28