Comando do Linux para encontrar arquivos alterados nos últimos n segundos

19

Eu gostaria que um comando do Linux encontrasse os arquivos alterados nos últimos nsegundos.

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

Peter Mortensen
fonte

Respostas:

14

Use o comando find assim:

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

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

anubhava
fonte
17
No Linux, usando find (de GNU Findutils 4.4.2), eu recebo um erro com este comando: find: missing argument to `-mtime'. No entanto, posso obter o comportamento desejado usando -mmin e um argumento decimal. Não pude encontrar nenhuma referência na página de manual para encontrar scomo argumento.
dr jimbob
4
-60s não é um argumento válido para -mtime. Os anos 60 também não são uma opção válida na localização de POSIX ou GNU. O argumento para -mtimeé um número que especifica o número de períodos de 24 horas atrás quando um arquivo foi modificado.
Dannysauer
13

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

Estou tendo o erro a seguir:

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

No entanto, eu posso usar -mmin(para modificado nos últimos m minutos) e pode usar um argumento decimal; por exemplo, o seguinte localiza arquivos modificados nos últimos 30 segundos.

find . -mmin 0.5

Então, por exemplo; criando arquivos modificados pela última vez 1s, 6s, 11s, ... atrás, 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

Portanto, se você realmente precisar dele em segundos, poderá 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
dr jimbob
fonte
8

Semelhante ao que a glenn sugeriu, se você deseja encontrar tudo modificado, digamos, no período em que um processo do instalador estava em execução, pode ser 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ê apenas encontra as coisas alteradas após o arquivo do ponto de verificação.

dannysauer
fonte
6

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

touch -d '-60 seconds' /tmp/newerthan
find . -name "*.txt" -newer /tmp/newerthan
scentos
fonte
6

A maneira mais simples de fazer isso é:

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

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

Um método alternativo usando mmin é o seguinte:

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 findversões.

shivams
fonte
2
Esta é claramente a melhor solução.
Rednoah #
1

Se você estiver monitorando um diretório em busca de alterações nos arquivos, provavelmente desejará usar as ferramentas inotify em vez de um loop infinito de pesquisas.

Glenn Jackman
fonte
1

Se sua versão de findnão aceitar segundos ou valores reais, assim como a minha, 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
soyayix
fonte