Commande Linux pour rechercher les fichiers modifiés au cours des n dernières secondes

19

J'aimerais qu'une commande Linux trouve les fichiers modifiés dans les dernières nsecondes.

Existe-t-il un script shell ou un autre outil que je peux exécuter à partir de l'interface de ligne de commande ou de l'interface graphique?

Peter Mortensen
la source

Réponses:

14

Utilisez la commande find comme celle-ci:

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

Pour trouver tous les *.txtfichiers modifiés au cours des 60 dernières secondes.

anubhava
la source
17
Dans linux, en utilisant find (de GNU Findutils 4.4.2), je reçois une erreur avec cette commande: find: missing argument to `-mtime'. Cependant, je peux obtenir le comportement souhaité en utilisant -mmin et un argument décimal. Je n'ai trouvé aucune référence dans la page de manuel pour trouver pour l'utiliser scomme argument.
dr jimbob
4
-60s n'est pas un argument valable pour -mtime. "60s" n'est pas non plus une option valide dans POSIX ou GNU find. L'argument de -mtimeest un nombre qui spécifie le nombre de périodes de 24 heures précédant la modification d'un fichier.
dannysauer
13

La solution avec mtime spécifiant les secondes ne fonctionne pas sur mes systèmes linux qui utilisent find --version== find (GNU findutils) 4.4.2.

J'obtiens l'erreur suivante:

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

Cependant, je peux utiliser -mmin(pour modifié dans les dernières minutes m), et peut-il prendre un argument décimal; Par exemple, ce qui suit trouve les fichiers modifiés au cours des 30 dernières secondes.

find . -mmin 0.5

Ainsi, par exemple; en créant les fichiers modifiés en dernier 1s, 6s, 11s, ... il y a 120 secondes, cette commande trouve:

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

Donc, si vous en avez vraiment besoin en quelques secondes, vous pouvez faire quelque chose comme:

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
la source
8

Semblable à ce que Glenn a suggéré, si vous voulez que tout soit modifié, par exemple, pendant la durée d'un processus d'installation, il pourrait être plus facile de faire quelque chose comme:

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

Ensuite, vous n'avez pas à faire le calcul du temps; vous trouvez juste que les choses ont changé après le fichier de point de contrôle.

dannysauer
la source
6

Si vous avez une version de find qui ne prend pas en charge, -mtime -60salors une meilleure solution est

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

La façon la plus simple de le faire est:

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

L' -mtime -60soption, mentionnée dans une réponse, ne fonctionne pas sur de nombreuses versions de find, même en 2016. -newermtest une bien meilleure option pour nous. Il peut analyser de nombreux formats de date et d'heure différents.

Une autre méthode utilisant mminest la suivante:

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

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

Cette option peut ne pas fonctionner pour toutes les findversions.

shivams
la source
2
C'est clairement la meilleure solution.
rednoah
1

Si vous surveillez un répertoire pour les modifications des fichiers, vous voudrez probablement utiliser inotify-tools au lieu d'une boucle d'interrogation infinie.

glenn jackman
la source
1

Si votre version de findn'accepte pas les secondes ou les valeurs réelles, tout comme la mienne, utilisez -mmin, mais spécifiez 0, et vous obtiendrez tous les fichiers modifiés en moins d'une minute:

$ touch test; find . -type f -mmin 0
./test
soyayix
la source