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.