Eu gostaria que um comando do Linux encontrasse os arquivos alterados nos últimos n
segundos.
Existe um script de shell ou outra ferramenta que eu possa executar a partir da interface da linha de comandos ou da GUI?
Eu gostaria que um comando do Linux encontrasse os arquivos alterados nos últimos n
segundos.
Existe um script de shell ou outra ferramenta que eu possa executar a partir da interface da linha de comandos ou da GUI?
Respostas:
Use o comando find assim:
find . -name "*.txt" -mtime -60s
Para encontrar todos os *.txt
arquivos modificados nos últimos 60 segundos.
-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.
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
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.
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 find
versões.
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.
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 encontrars
como argumento.