Comment supprimer des fichiers de plus de X heures

191

J'écris un script bash qui doit supprimer les anciens fichiers.

Il est actuellement implémenté en utilisant:

find $LOCATION -name $REQUIRED_FILES -type f -mtime +1 -delete

Cela supprimera les fichiers de plus d'un jour.

Cependant, que se passe-t-il si j'ai besoin d'une résolution plus fine ce jour-là, disons 6 heures? Existe-t-il un moyen simple de le faire, comme il y a l'utilisation de find et -mtime?

Tom Feiner
la source

Réponses:

303

Avez-vous findl' -mminoption? Cela peut vous permettre de tester le nombre de minutes depuis la dernière modification:

find $LOCATION -name $REQUIRED_FILES -type f -mmin +360 -delete

Ou peut-être envisager d'utiliser tmpwatchpour faire le même travail. phjr également recommandé tmpreaperdans les commentaires.

Paul Dixon
la source
2
L'utilisation de --mmin + X renvoie tous les fichiers avec ma recherche. Ma faute de ne pas avoir vérifié cela en premier, mais cette commande vient de supprimer la plupart de mon répertoire personnel. Pour moi, --mmin -X est le bon argument.
brandones
tmpreaper est un fork de tmpwatch. Il est plus sûr et existe en tant que package Debian dans la distribution. Avantages par rapport à find -delete: tmpreaper ne supprimera pas les liens symboliques, les sockets, les fifos ou les fichiers spéciaux
Nadir
Faites remarquer que $ REQUIRED_FILES doit être entre guillemets (guillemets doubles) et que vous pouvez utiliser un modèle comme: " .txt" pour tous les fichiers .txt ou les fichiers commençant par un modèle comme: "temp- " pour supprimer tous les fichiers nommés avec temp -
achasinh
@PaulDixon comment modifier cela pour que $LOCATIONet $REQUIRED_FILESpuissent tous les deux avoir plusieurs valeurs telles que dir1 dir2et *.txt *.tmp?
Enissay
@Enissay $ LOCATION est un répertoire unique. Pour plusieurs extensions, vous voudrez probablement utiliser un modèle avec -regex - voir stackoverflow.com/questions/5249779/...
Paul Dixon
9

Vous pouvez utiliser cette astuce: créez un fichier il y a 1 heure et utilisez l' -newer fileargument.

(Ou utilisez touch -tpour créer un tel fichier).

xtofl
la source
1
il n'y a pas de commutateur -older (au moins dans ma commande find), et c'est ce qui serait nécessaire. -newer n'aide pas.
iconoclaste le
pouvez-vous donner une commande tactile qui générerait un fichier vieux d'une heure qui fonctionnera sur les machines qui ne peuvent pas utiliser -mmin? (Si vous êtes sous Linux, -mmin est disponible, sinon la date et les autres commandes sont également faibles en comparaison.)
iconoclast
2
@iconoclast touch -t $(date -d '-1 hour' +%Y%m%d%H%M.00) testCrée un fichier datant testtoujours d'une heure.
rovr138
4

Voici l'approche qui a fonctionné pour moi (et je ne la vois pas utilisée ci-dessus)

$ find /path/to/the/folder -name *.* -mmin +59 -delete > /dev/null

supprimer tous les fichiers datant de plus de 59 minutes tout en laissant les dossiers intacts.

Axel Ronsin
la source
Il est préférable d' '*.*'utiliser des guillemets simples ou le shell l'étendra aux noms de fichiers réels au lieu de le conserver comme caractère générique pour findle résoudre. Cela interrompt findl'opération récursive sur les sous-répertoires.
MestreLion
Gardez à l' esprit que -name '*.*'ne sera pas supprimer des fichiers sans extension, tels que README, Makefile, etc.
MestreLion
1

Pour SunOS 5.10

 Example 6 Selecting a File Using 24-hour Mode


 The descriptions of -atime, -ctime, and -mtime use the  ter-
 minology n ``24-hour periods''. For example, a file accessed
 at 23:59 is selected by:


   example% find . -atime -1 -print




 at 00:01 the next day (less than 24 hours  later,  not  more
 than one day ago). The midnight boundary between days has no
 effect on the 24-hour calculation.
Rajeev Rumale
la source
0

-mmin correspond à des minutes.

Essayez de consulter la page de manuel.

man find

pour plus de types.

GavinCattell
la source
0

Si vous n'avez pas "-mmin" dans votre version de "find", alors "-mtime -0.041667" est assez proche de "dans la dernière heure", donc dans votre cas, utilisez:

-mtime +(X * 0.041667)

donc, si X signifie 6 heures, alors:

find . -mtime +0.25 -ls

fonctionne parce que 24 heures * 0,25 = 6 heures

Malcolm Boekhoff
la source
J'avais de l'espoir parce que cet ancien UNIX n'a ​​pas -mmin, mais, malheureusement, cela n'aide pas car cet ancien UNIX n'aime pas non plus les valeurs fractionnaires pour mtime: find: l'argument de -mtime doit être un entier compris entre -2147483647 et 2147483647
kbulgrien le
0

Voici ce que l'on peut faire pour continuer comme @iconoclast s'interrogeait dans son commentaire sur une autre réponse.

utilisez crontab pour l'utilisateur ou /etc/crontabpour créer un fichier /tmp/hour:

# m h dom mon dow user  command
0 * * * * root /usr/bin/touch /tmp/hour > /dev/null 2>&1

puis utilisez ceci pour exécuter votre commande:

find /tmp/ -daystart -maxdepth 1 -not -newer /tmp/hour -type f -name "for_one_hour_files*" -exec do_something {} \;
satyr0909
la source
*/1for hourly est redondant dans votre crontab. C'est la même chose que de mettre * dans le champ des heures.
colm.anseo
0

find $PATH -name $log_prefix"*"$log_ext -mmin +$num_mins -exec rm -f {} \;

Eragonz91
la source
0

Si on findn'a pas -mminet si on est aussi coincé avec un findqui n'accepte que des valeurs entières pour -mtime, alors tout n'est pas nécessairement perdu si l'on considère que "plus ancien que" est similaire à "pas plus récent que".

Si nous avons pu créer un fichier qui a un mtime de notre heure limite, nous pouvons demander findà localiser les fichiers qui ne sont "pas plus récents que" notre fichier de référence.

Créer un fichier avec l'horodatage correct est un peu compliqué car un système qui ne dispose pas d'un find a probablement aussi moins que capable de datecommande qui pourrait faire des choses comme: date +%Y%m%d%H%M%S -d "6 hours ago".

Heureusement, d'autres anciens outils peuvent gérer cela, bien que de manière plus lourde.

Considérez que six heures correspondent à 21600 secondes. Nous voulons trouver l'heure d'il y a six heures dans un format utile:

$ date && perl -e '@d=localtime time()-21600; \
  printf "%4d%02d%02d%02d%02d.%02d\n", $d[5]+1900,$d[4]+1,$d[3],$d[2],$d[1],$d[0]'
> Thu Apr 16 04:50:57 CDT 2020
202004152250.57

L'instruction perl a produit une date utile, mais elle doit être mieux utilisée:

$ date && touch -t `perl -e '@d=localtime time()-21600; \
  printf "%4d%02d%02d%02d%02d.%02d\n", \
  $d[5]+1900,$d[4]+1,$d[3],$d[2],$d[1],$d[0]'` ref_file && ls -l ref_file
Thu Apr 16 04:53:54 CDT 2020
-rw-rw-rw-   1 root     sys            0 Apr 15 22:53 ref_file

Maintenant, la solution pour cet ancien UNIX est quelque chose du genre:

$ find . -type f ! -newer ref_file -a ! -name ref_file -exec rm -f "{}" \;

Cela peut aussi être une bonne idée de nettoyer notre fichier de référence ...

$ rm -f ref_file
kbulgrien
la source