Comando Linux para encontrar arquivos alterados nos últimos n segundos

16

Gostaria que um comando do Linux localizasse arquivos alterados no último n segundos.

Existe um script de shell ou outra ferramenta que eu possa executar a partir da interface de linha de comando ou GUI?

    
por Peter Mortensen 21.06.2011 / 19:41

7 respostas

14

Use o comando find assim:

find . -name "*.txt" -mtime -60s

Para encontrar todos os arquivos *.txt modificados nos últimos 60 segundos.

    
por 21.06.2011 / 19:50
8

A solução com mtime especificando segundos não funciona nos meus sistemas linux que usam find --version == find (GNU findutils) 4.4.2 .

Eu recebo o seguinte erro:

mycomputer:~/new$ find . -mtime -60s
find: missing argument to '-mtime'
mycomputer:~/new$ find . -mtime -60seconds
find: missing argument to '-mtime'

No entanto, posso usar -mmin (para modificado nos últimos m minutos) e ele pode receber um argumento decimal; Por exemplo, os seguintes arquivos de localização foram modificados nos últimos 30 segundos.

find . -mmin 0.5

Então, por exemplo; criando arquivos modificados pela última vez nos últimos 1s, 6s, 11s, ... nos últimos 120 segundos, este comando encontra:

mycomputer:~/new$ for i in $(seq 1 5 120); do touch -d "-$i seconds" last_modified_${i}_seconds_ago ; done
mycomputer:~/new$ find . -mmin 0.5
.
./last_modified_1_seconds_ago
./last_modified_26_seconds_ago
./last_modified_11_seconds_ago
./last_modified_16_seconds_ago
./last_modified_21_seconds_ago
./last_modified_6_seconds_ago

Então, se você realmente precisar em segundos, pode fazer algo como:

localhost:~/new$ for i in $(seq 1 1 120); do touch -d "-$i seconds" last_modified_${i}_seconds_ago ; done
localhost:~/new$ N=18; find . -mmin $(echo "$N/60"|bc -l)
./last_modified_1_seconds_ago
./last_modified_9_seconds_ago
./last_modified_14_seconds_ago
./last_modified_4_seconds_ago
./last_modified_12_seconds_ago
./last_modified_13_seconds_ago
./last_modified_8_seconds_ago
./last_modified_3_seconds_ago
./last_modified_5_seconds_ago
./last_modified_11_seconds_ago
./last_modified_17_seconds_ago
./last_modified_16_seconds_ago
./last_modified_7_seconds_ago
./last_modified_15_seconds_ago
./last_modified_10_seconds_ago
./last_modified_6_seconds_ago
./last_modified_2_seconds_ago
    
por 04.06.2013 / 17:57
8

Semelhante ao que Glenn sugeriu, se você quiser encontrar tudo modificado, digamos, no tempo durante o qual o processo de instalação estava em execução, talvez seja mais fácil fazer algo como:

touch /tmp/checkpoint
<do installer stuff>
find / -newer /tmp/checkpoint

Então você não precisa fazer o cálculo do tempo; você acabou de encontrar coisas alteradas após o arquivo do ponto de verificação.

    
por 21.06.2011 / 21:30
6

Se você tem uma versão de pesquisa que não suporta -mtime -60s , então uma solução melhor é

touch -d '-60 seconds' /tmp/newerthan
find . -name "*.txt" -newer /tmp/newerthan
    
por 10.10.2011 / 14:48
4

A maneira mais simples de fazer isso é:

find . -name "*.txt" -newermt '6 seconds ago'

A opção -mtime -60s , mencionada em uma resposta, não funciona em muitas versões de find , mesmo em 2016. -newermt é uma opção muito melhor para nós. Pode analisar muitos formatos diferentes de data e hora.

Um método alternativo usando mmin é este:

find . -name "*.txt" -mmin -0.5

# Finds files modified within the last 0.5 minute, i.e. last 30 seconds

Esta opção pode não funcionar para todas as versões find .

    
por 30.07.2016 / 06:50
1

Se você estiver monitorando um diretório em busca de alterações nos arquivos, provavelmente desejará usar inotify-tools em vez de algum ciclo de pesquisa infinito.

    
por 21.06.2011 / 21:10
1

Se a sua versão de find não aceitar segundos ou valores reais, assim como o meu, use -mmin , mas especifique 0, e todos os arquivos serão modificados em menos de um minuto:

$ touch test; find . -type f -mmin 0
./test
    
por 30.01.2015 / 00:42