web-dev-qa-db-fra.com

Comment trouver des fichiers modifiés au cours des x dernières minutes (find -mmin ne fonctionne pas comme prévu)

J'essaie de trouver des fichiers modifiés au cours des x dernières minutes, par exemple au cours de la dernière heure. De nombreux forums et tutoriels sur le net suggèrent d'utiliser la commande find avec l'option -mmin, comme ceci:

find . -mmin -60 |xargs ls -l

Cependant, cette commande n'a pas fonctionné pour moi comme prévu. Comme vous pouvez le voir dans la liste suivante, il montre également les fichiers modifiés il y a moins d'une heure:

-rw------- 1 user user   9065 Oct 28 23:13 1446070435.V902I67a5567M283852.harvester
-rw------- 1 user user   1331 Oct 29 01:10 1446077402.V902I67a5b34M538793.harvester
-rw------- 1 user user   1615 Oct 29 01:36 1446078983.V902I67a5b35M267251.harvester
-rw------- 1 user user  72365 Oct 29 02:27 1446082022.V902I67a5b36M873811.harvester
-rw------- 1 user user  69102 Oct 29 02:27 1446082024.V902I67a5b37M142247.harvester
-rw------- 1 user user   2611 Oct 29 02:34 1446082482.V902I67a5b38M258101.harvester
-rw------- 1 user user   2612 Oct 29 02:34 1446082485.V902I67a5b39M607107.harvester
-rw------- 1 user user   2600 Oct 29 02:34 1446082488.V902I67a5b3aM465574.harvester
-rw------- 1 user user  10779 Oct 29 03:27 1446085622.V902I67a5b3bM110329.harvester
-rw------- 1 user user   5836 Oct 29 03:27 1446085623.V902I67a5b3cM254104.harvester
-rw------- 1 user user   8970 Oct 29 04:27 1446089232.V902I67a5b3dM936339.harvester
-rw------- 1 user user 165393 Oct 29 06:10 1446095400.V902I67a5b3eM290158.harvester
-rw------- 1 user user 105054 Oct 29 06:10 1446095430.V902I67a5b3fM265065.harvester
-rw------- 1 user user   1615 Oct 29 06:24 1446096244.V902I67a5b40M55701.harvester
-rw------- 1 user user   1620 Oct 29 06:24 1446096292.V902I67a5b41M337769.harvester
-rw------- 1 user user  10436 Oct 29 06:36 1446096973.V902I67a5b42M707215.harvester
-rw------- 1 user user   7150 Oct 29 06:36 1446097019.V902I67a5b43M415731.harvester
-rw------- 1 user user   4357 Oct 29 06:39 1446097194.V902I67a5b56M446687.harvester
-rw------- 1 user user   4283 Oct 29 06:39 1446097195.V902I67a5b57M957052.harvester
-rw------- 1 user user   4393 Oct 29 06:39 1446097197.V902I67a5b58M774506.harvester
-rw------- 1 user user   4264 Oct 29 06:39 1446097198.V902I67a5b59M532213.harvester
-rw------- 1 user user   4272 Oct 29 06:40 1446097201.V902I67a5b5aM534679.harvester
-rw------- 1 user user   4274 Oct 29 06:40 1446097228.V902I67a5b5dM363553.harvester
-rw------- 1 user user  20905 Oct 29 06:44 1446097455.V902I67a5b5eM918314.harvester

En fait, tous les fichiers du répertoire en cours sont listés. Nous pouvons prendre un de ces fichiers comme exemple et vérifier si son heure de modification est vraiment telle qu’elle est affichée par la commande ls:

stat 1446070435.V902I67a5567M283852.harvester

  File: ‘1446070435.V902I67a5567M283852.harvester’
  Size: 9065        Blocks: 24         IO Block: 4096   regular file
Device: 902h/2306d  Inode: 108680551   Links: 1
Access: (0600/-rw-------)  Uid: ( 1001/   user)   Gid: ( 1027/   user)
Access: 2015-10-28 23:13:55.281515368 +0100
Modify: 2015-10-28 23:13:55.281515368 +0100
Change: 2015-10-28 23:13:55.313515539 +0100

Comme nous pouvons le constater, ce fichier a été définitivement modifié pour la dernière fois plus tôt il y a plus d'une heure! J'ai aussi essayé find -mmin 60 ou find -mmin +60, mais cela n'a pas fonctionné non plus.

Pourquoi cela se produit-il et comment utiliser correctement la commande find?

29
hashbang

Je peux reproduire votre problème s'il n'y a pas de fichiers dans le répertoire qui ont été modifiés au cours de la dernière heure. Dans ce cas, find . -mmin -60 ne renvoie rien. Cependant, la commande find . -mmin -60 |xargs ls -l renvoie tous les fichiers du répertoire, ce qui correspond à ce qui se passe lorsque ls -l est exécuté sans argument.

Pour vous assurer que ls -l n'est exécuté que lorsqu'un fichier est trouvé, essayez:

find . -mmin -60 -type f -exec ls -l {} +
43
John1024

Le problème est que

find . -mmin -60

les sorties:

.
./file1
./file2

Notez la ligne avec un point?
Cela donne à ls la liste de tout le répertoire exactement comme lorsque ls -l . était exécuté.

Une solution consiste à ne répertorier que les fichiers (pas les répertoires):

find . -mmin -60 -type f | xargs ls -l

Mais il est préférable d’utiliser directement l’option -exec de find:

find . -mmin -60 -type f -exec ls -l {} \;

Ou juste:

find . -mmin -60 -type f -ls

Ce qui est d'ailleurs sûr même avec les répertoires:

find . -mmin -60 -ls
11
user2350426

Pour rechercher des fichiers dans/target_directory et tous ses sous-répertoires modifiés au cours des 60 dernières minutes:

$ find /target_directory -type f -mmin -60

Pour rechercher les derniers fichiers modifiés, triés dans l’ordre inverse de la date de mise à jour (c’est-à-dire les fichiers les plus récemment mis à jour en premier):

$ find /etc -type f -printf '%TY-%Tm-%Td %TT %p\n' | sort -r
8
akash

Je travaille sur le même besoin et je crois que votre calendrier est incorrect.

Essayez ces:

  • 15min changement: trouver. -mtime -.01
  • Changement d'1h: trouver. -mtime -.04
  • Changement 12 heures: trouver. -mtime -.5

Vous devriez utiliser 24 heures comme base. Le nombre après -mtime devrait être relatif à 24 heures. Ainsi, -5 équivaut à 12 heures, car 12 heures correspond à la moitié de 24 heures.

3
whakawaehere

Manuel de recherche: 

   Numeric arguments can be specified as

   +n     for greater than n,

   -n     for less than n,

   n      for exactly n.

   -amin n
          File was last accessed n minutes ago.

   -anewer file
          File was last accessed more recently than file was modified.  If file is a symbolic link and the -H option or the -L option is in effect, the access time of the file it points  to  is  always
          used.

   -atime n
          File  was  last  accessed  n*24 hours ago.  When find figures out how many 24-hour periods ago the file was last accessed, any fractional part is ignored, so to match -atime +1, a file has to
          have been accessed at least two days ago.

   -cmin n
          File's status was last changed n minutes ago.

   -cnewer file
          File's status was last changed more recently than file was modified.  If file is a symbolic link and the -H option or the -L option is in effect, the status-change time of the file it  points
          to is always used.

   -ctime n
          File's status was last changed n*24 hours ago.  See the comments for -atime to understand how rounding affects the interpretation of file status change times.

Exemple:

find /dir -cmin -60 # creation time
find /dir -mmin -60 # modification time
find /dir -amin -60 # access time
2
Noproblem

Cela peut fonctionner pour vous. Je l'ai utilisé pour nettoyer les dossiers pendant les déploiements afin de supprimer les anciens fichiers de déploiement.

clean_anyfolder() {
    local temp2="$1/**"; //PATH
    temp3=( $(ls -d $temp2 -t | grep "`date | awk '{print $2" "$3}'`") )
    j=0;
    while [ $j -lt ${#temp3[@]} ]
    do
            echo "to be removed ${temp3[$j]}"
            delete_file_or_folder ${temp3[$j]} 0 //DELETE HERE
        fi
        j=`expr $j + 1`
    done
}
0
sikar

En fait, il y a plus d'un problème ici. La principale est que xargs exécute par défaut la commande que vous avez spécifiée, même si aucun argument n'a été passé. Pour changer cela, vous pouvez utiliser une extension GNU en xargs:

--no-run-if-empty
-r
Si l'entrée standard ne contient pas de caractères non vides, n'exécutez pas la commande. Normalement, la commande est exécutée une fois, même s'il n'y a pas d'entrée. Cette option est une extension GNU.

Exemple simple:

find . -mmin -60 | xargs -r ls -l

Mais cela peut correspondre à tous les sous-répertoires, y compris . (le répertoire actuel), et ls listera chacun d'eux individuellement. Donc, la sortie sera un désordre. Solution: passez -d à ls, qui interdit de répertorier le contenu du répertoire:

find . -mmin -60 | xargs -r ls -ld

Maintenant, vous n'aimez pas . (le répertoire actuel) dans votre liste? Solution: exclure le premier niveau de répertoire (0) de la sortie de recherche:

find . -mindepth 1 -mmin -60 | xargs -r ls -ld

Maintenant, vous n’avez besoin que des fichiers de votre liste? Solution: exclure les répertoires:

find . -type f -mmin -60 | xargs -r ls -l

Vous avez maintenant des fichiers avec des noms contenant des espaces, des guillemets ou des barres obliques inverses? Solution: utilisez une sortie à terminaison nulle (find) et une entrée (xargs) (ce sont aussi des extensions GNU, toujours):

find . -type f -mmin -60 -print0 | xargs -r0 ls -l
0
t0r0X