Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

suppression de fichier par find et message d'erreur

5 réponses
Avatar
Christophe PEREZ
Bonjour,

Faisant un peu de nettoyage par script, je me rends compte d'une erreur
renvoyée par find, qui me laisse totalement perplexe.
Rendu à sa plus simple expression, voici l'exemple de démo :

$ mkdir test
$ find . -name test -exec rmdir {} \;
find: "./test": Aucun fichier ou dossier de ce type
$ ls -l test
ls: impossible d'accéder à test: Aucun fichier ou dossier de ce type

Le répertoire a bien été supprimé, mais alors pourquoi find cherche-t'il
à le trouver après l'avoir supprimé ?
Ça semble lié au rmdir, puisqu'un rm sur un fichier "normal" ne le fait
pas.

Ça va sans doute parler aux experts, mais moi ça me laisse coi.

NB : tout ça parce que tmpwatch ne sait pas virer le répertoire contenant
devenu vide (en tout cas, je n'ai pas trouvé comment faire).

5 réponses

Avatar
Erwan David
Christophe PEREZ écrivait :

Bonjour,

Faisant un peu de nettoyage par script, je me rends compte d'une erreur
renvoyée par find, qui me laisse totalement perplexe.
Rendu à sa plus simple expression, voici l'exemple de démo :

$ mkdir test
$ find . -name test -exec rmdir {} ;
find: "./test": Aucun fichier ou dossier de ce type
$ ls -l test
ls: impossible d'accéder à test: Aucun fichier ou dossier de ce type

Le répertoire a bien été supprimé, mais alors pourquoi find cherche-t'il
à le trouver après l'avoir supprimé ?
Ça semble lié au rmdir, puisqu'un rm sur un fichier "normal" ne le fait
pas.

Ça va sans doute parler aux experts, mais moi ça me laisse coi.

NB : tout ça parce que tmpwatch ne sait pas virer le répertoire contenant
devenu vide (en tout cas, je n'ai pas trouvé comment faire).



find traite le répertoire avant de descendre dedans. Donc là il voit
./test, fait rmdir ./test, puis cd ./test : d'où le problème.

Pour qu'il traite le contenu du répertoire avant le répertoire lui même,
il faut utiliser l'option -depth de find

--
Les simplifications c'est trop compliqué
Avatar
Francois Lafont
Hello,

Le 30/12/2014 20:01, Christophe PEREZ a écrit :

Faisant un peu de nettoyage par script, je me rends compte d'une erreur
renvoyée par find, qui me laisse totalement perplexe.
Rendu à sa plus simple expression, voici l'exemple de démo :

$ mkdir test
$ find . -name test -exec rmdir {} ;
find: "./test": Aucun fichier ou dossier de ce type
$ ls -l test
ls: impossible d'accéder à test: Aucun fichier ou dossier de ce type

Le répertoire a bien été supprimé, mais alors pourquoi find cherche-t'il
à le trouver après l'avoir supprimé ?
Ça semble lié au rmdir, puisqu'un rm sur un fichier "normal" ne le fait
pas.



En fait, ton message ne vient pas de rmdir, mais bien de find lui-même
comme le suggère le message d'erreur. En fait, c'est assez simple. Tu
demandes à find de chercher des fichiers qui s'appellent "test" et, une
fois que find trouve un machin qui s'appelle "test", tu lui demandes de
faire un rmdir dessus (au passage sans être sûr que le machin en question
est un répertoire et qu'il est vide mais ce n'est pas le problème ici).

Seulement une fois que find est tombé sur ton répertoire ./test et qu'il
a exécuté son rmdir dessus, find continue sa recherche, il ne sait pas que
tu as supprimé le répertoire ./test (il n'est pas assez « intelligent »
pour comprendre la commande -exec que tu lui as demandé de lancer) et donc
il continue sa recherche dans le répertoire ./test (find effectue des
recherches récursives par défaut, ie s'il voit un répertoire, il va chercher
dedans) seulement celui-ci n'existe plus (à cause du rmdir) et donc find
affiche l'erreur que tu peux voir.

Pour éviter ton message d'erreur, je pense qu'un truc comme ça devrait
fonctionner :

find . -type d -empty -name test -prune -exec rmdir {} ;

On se limite aux répertoires vides (via -type d -empty) et l'option
-prune dit à find de ne pas poursuivre la recherche dans le répertoire
qui vient de matcher les conditions précédentes (qu'on me corrige si je
dis une bêtise car -prune est une option qui m'a toujours paru un peu
sioux).

À+ et bonnes fêtes. ;)

--
François Lafont
Avatar
tth
On 12/30/2014 08:01 PM, Christophe PEREZ a dit:

Faisant un peu de nettoyage par script, je me rends compte d'une erreur
renvoyée par find, qui me laisse totalement perplexe.
Rendu à sa plus simple expression, voici l'exemple de démo :

$ mkdir test
$ find . -name test -exec rmdir {} ;
find: "./test": Aucun fichier ou dossier de ce type



Déja, si tu veux un rmdir, il faut dire à find que tu ne
cherches que les directories : "-type d" pour sélecter.
Avatar
Christophe PEREZ
Le Tue, 30 Dec 2014 20:19:27 +0100, Erwan David a écrit :

find traite le répertoire avant de descendre dedans. Donc là il voit
./test, fait rmdir ./test, puis cd ./test : d'où le problème.



évidemment...

Pour qu'il traite le contenu du répertoire avant le répertoire lui même,
il faut utiliser l'option -depth de find



ou maxdepth 0 non ?
Bon, dans tous les cas, j'ai compris, et j'ai plusieurs solutions de
contournement.
Merci bien.
Avatar
Christophe PEREZ
Le Tue, 30 Dec 2014 22:13:51 +0100, tth a écrit :

Déja, si tu veux un rmdir, il faut dire à find que tu ne cherches
que les directories : "-type d" pour sélecter.



Tsss tsss, j'ai bien dit que j'utilisais l'expression la plus simple pour
révéler ce qui me gênait. Je n'ai jamais dit que j'utilisais cette
expression telle quelle :)