2 votes

La commande find sélectionne les fichiers dont le motif n'est pas apparenté.

J'ai les éléments suivants find que je déclenche via autosys planificateur. Cette commande est utilisée pour supprimer les fichiers plus anciens que X jours.

find /home/my_home/document -maxdepth 1 -type f -mtime +31 -name "qwer_*" -delete -print

Mais la commande ci-dessus échoue. Ce qui est bizarre, c'est que dans les journaux, je peux voir que find récupère les fichiers qui ne correspondent même pas à l'adresse de l'utilisateur. qwer_* motif

eg.

find: `/home/my_home/document/yumn.txt': No such file or directory
find: `/home/my_home/document/ztry.txt': No such file or directory

Est-ce que je rate quelque chose dans find commandement.

1voto

Kamil Maciorowski Points 57004

Dans votre question précédente vous avez dit :

Je pense que c'est dû à un autre travail parallèle qui supprime certains des fichiers.

C'est exactement ce qui s'est passé dans cette affaire. Votre find J'ai découvert qu'il y a un fichier yumn.txt puis le fichier a été supprimé, puis find a essayé de faire quelque chose avec le fichier et a échoué. Le même scénario pour ztry.txt .

Notez que cela ne signifie pas que si yumn.txt n'a pas été simultanément supprimé, alors find l'effacerait et l'imprimerait. Cela signifie seulement yumn.txt a disparu de façon inattendue avant find a fini de le tester.


Vous pouvez vous attendre à -name "qwer_*" de rejeter yumn.txt selon la liste de l'annuaire unique (à partir duquel find apprend l'existence du fichier en premier lieu), de sorte que l'outil n'a jamais besoin d'interroger le fichier lui-même (plus tard, lorsque le fichier n'existe pas). Mes tests indiquent que ce n'est pas toujours le cas.

En général find peut ou non réorganiser les tests. Cela signifie que -name "qwer_*" peut être testé avant ou après -mtime +31 etc. Par exemple, GNU find réorganise les expressions de façon à ce que les tests basés uniquement sur les noms de fichiers soient effectués en avance. Voir man 1 find , -O y -D options. Mais dans votre cas peut-être ce que vous avez tapé en premier a été testé en premier, donc yumn.txt était destiné à être testé contre -type f y -mtime +31 et au moins un de ces tests exigeait que le fichier existe au moment où le test était effectué.

Mais même avec une seule find . -name "qwer_*" il est possible de rencontrer le problème. J'ai testé comme ceci :

while true; do touch yumn.txt; rm yumn.txt; done &

Puis ls yumn.txt trouverait un fichier ou pas. Vous pouvez répéter ls yumn.txt plusieurs fois et parfois vous trouverez un fichier, parfois non. C'est normal.

Dans ma Debian, lorsque yumn.txt ne cesse d'être créé et détruit sur un système de fichiers Btrfs, find . -name "qwer_*" ne s'en plaint pas ; ou du moins, il ne s'en est pas plaint lorsque j'ai fait des tests répétés plus de 4 000 fois.

D'autre part, dans mon routeur OpenWRT find . -name "qwer_*" parfois hace se plaignent, et le message est presque exactement le même que le vôtre :

find: ./yumn.txt: No such file or directory

C'est find de BusyBox et le système de fichiers est overlayfs (avec ext3 comme répertoire supérieur). La conclusion est la suivante : dans certaines circonstances, il est possible qu'un fichier soit supprimé par un autre processus, ce qui rendrait l'opération plus difficile. find se plaint (et renvoie un statut de sortie non nul !), même si -name pourrait en théorie rejeter le fichier en premier lieu.


Ce n'est pas une solution générale, mais dans votre cas spécifique, vous pouvez essayer cette approche :

find /home/my_home/document/qwer_* -maxdepth 0 -type f -mtime +31 -delete -print

Maintenant, le Shell effectue une correspondance de motifs et exécute find avec seulement les fichiers correspondants comme points de départ. En raison de -maxdepth 0 find examine uniquement les fichiers donnés (pertinents si au moins l'un d'entre eux se trouve être un répertoire). De cette façon, la disparition yumn.txt ou autre ne peut affecter find . Problèmes possibles :

  • Si qwer_* sont supprimés par un ou plusieurs autres processus (comme yumn.txt était), il peut arriver find se plaint et renvoie un statut de sortie non nul.
  • S'il y a trop de qwer_* alors vous obtiendrez Argument list too long (ou similaire).
  • S'il n'y a pas de correspondance, find sera littéral /home/my_home/document/qwer_* point de départ et se plaindre de l'inexistence d'un fichier/répertoire.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X