suppression de fichier par find et message d'erreur
5 réponses
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).
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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é
Christophe PEREZ <chris@novazur.fr> é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
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é
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
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).
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
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.
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.
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.
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.
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.
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.
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 :)
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 :)
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 :)