67 votes

J'essaie de supprimer un répertoire avec "rm -rf", mais j'obtiens un message indiquant qu'il n'est pas vide.

J'ai essayé de supprimer un répertoire en utilisant "rm -rf" et j'obtiens le message "Directory not empty" :

Bens-MacBook-Pro:please benjaminhocking$ ls -lart empty_directory/
total 16
drwxr-xr-x  5 benjaminhocking  staff  170 Aug 27 14:46 .
drwxr-xr-x  3 benjaminhocking  staff  102 Aug 27 15:28 ..
Bens-MacBook-Pro:please benjaminhocking$ rm -rf empty_directory/
rm: empty_directory/: Directory not empty
Bens-MacBook-Pro:please benjaminhocking$ rmdir empty_directory/
rmdir: empty_directory/: Directory not empty

Si j'essaie la même chose en utilisant le Finder (en faisant glisser le dossier vers la Corbeille), j'obtiens le message suivant

L'opération ne peut pas être achevée car l'élément "empty_directory" est en cours d'utilisation.

J'ai essayé de faire xattr -d com.apple.quarantine par pure superstition, mais ça n'a servi à rien.

Un élément de contexte probablement important est que ce répertoire se trouvait initialement dans un répertoire qui aurait dû être supprimé par une commande "make clean" que j'ai lancée avant que le terminal ne se bloque, après quoi un peu plus de la moitié des autres programmes que j'avais en cours d'exécution se sont également bloqués, y compris Skype, et finalement le système d'exploitation lui-même. J'ai fini par devoir redémarrer l'ordinateur en appuyant sur la touche d'alimentation et en la maintenant enfoncée.

Modifier pour ajouter : Un autre élément d'information important que j'ai laissé de côté est que cela se passait dans un dossier chiffré à la encfs . J'ai pu retrouver le dossier correspondant dans la partie cryptée des choses et le supprimer là. Je ne sais toujours pas pourquoi je n'ai pas pu le faire à partir du côté décrypté des choses comme je le fais normalement. Je vais laisser cette question sans réponse pour le moment, au cas où quelqu'un aurait une bonne réponse à cette question.

2voto

m1. Points 121

Si cela se produit et que vous êtes sûr de vouloir tout supprimer, vous devriez essayer d'utiliser sudo rm -rf directory/

1voto

Ben m Points 21

Pour le bénéfice des lecteurs :

Méfiez-vous de rm -rf dans un tel cas ! Cela peut créer des problèmes ailleurs s'il s'agit d'un partage de réseau ! Vous êtes prévenus !

Dans presque tous les cas, si un directory semble être vide, utilisez rmdir directory ou peut-être sudo rmdir directory . Ne pas utiliser rm (ou del sous Windows). Si cela ne fonctionne pas, vous devez trouver ce qui bloque cette demande, y remédier, puis réessayer l'opération. rmdir .

Veuillez noter que je ne connais pas OS-X, mais je pense que les choses y sont très similaires au comportement d'Unix/BSD.

Il est très probable que le répertoire en question était juste un point de montage (à partir des encfs) ou résidant sur un point de montage qui est devenu en lecture seule ou bloqué dans un état inapproprié (ce qui a empêché la suppression du répertoire). Si vous forcez maintenant la suppression du répertoire, de très mauvaises choses peuvent se produire.

Dans le bon cas, le répertoire était vraiment vide, donc le supprimer (en détruisant le montage, etc.) n'a pas causé de dommages supplémentaires. Dans le mauvais cas, il n'était pas vide, il semblait juste l'être, ce qui signifie que vous avez mis à la poubelle quelque chose que vous ne vouliez peut-être pas tuer. Tout dépend du type de support, des pilotes utilisés, etc.

Si les choses sont mises en œuvre raisonnablement bien, normalement rien de mauvais ne devrait se produire. Mais ce n'est pas le cas. Les choses sont déjà dans un état bizarre, ce qui signifie : Quelque chose ne va pas, alors mieux vaut ne pas essayer de tout mélanger encore plus ! Si quelque chose est fissuré, n'importe quel contact incorrect peut le briser.

Par exemple, si vous rencontrez une condition de course sur un partage réseau, il se peut que votre rm -rf supprime les données qui viennent d'être copiées sur le partage par quelqu'un d'autre.

Cependant rmdir est garanti pour ne jamais faire de mal, à part supprimer les répertoires vraiment vides. Ceci est même vrai sur NFS, car NFS ne garantit un comportement réellement atomique que sur mkdir et rmdir mais nulle part ailleurs.

FYI :

Vous pouvez détecter un point de montage en utilisant l'outil mountpoint directory . Vous pouvez également examiner la sortie de mount et essayez d'y repérer vos montures. Mais attention, au moins sous Linux, cela pourrait mentir. En utilisant le mountpoint plus fiable mais moins pratique.

Dans ce cas vous avez trouvé le point de montage, vous pouvez le démonter et ensuite supprimer le répertoire, c'est la séquence suivante :

umount directory rmdir directory

Si nécessaire, utilisez sudo comme d'habitude.

Notes :

  • Les partages réseau peuvent refuser rmdir (et tout le reste) en raison des droits d'accès.

  • Les systèmes de fichiers défectueux peuvent refuser rmdir en fonction de la stratégie d'échec. Peut-être verrez-vous un message raisonnable dans ce cas, peut-être pas.

  • Sous Linux (et probablement sous tout autre système d'exploitation moderne), vous pouvez également restreindre l'accès en utilisant différents moyens (comme monter quelque chose en lecture seule, des capacités comme dans SeLinux, etc.) ). Cela signifie alors que vous ne voyez pas qu'il s'agit d'un point de montage, et que vous ne voyez rien d'anormal, mais que cela ne fonctionne tout simplement pas. Dans ce cas, vous devez chercher une autre raison, qui peut être très profondément enfouie dans le système d'exploitation. Cela dépend de l'outil si vous voyez un message d'erreur raisonnable. Vous pouvez également jeter un coup d'œil au syslog/kernel-log, comme par exemple dmesg sous Linux (désolé, je ne connais pas l'équivalent sous OS-X).

  • Notez que le verrouillage obligatoire des fichiers peut également être une source. Bien que cela soit normal sous Windows, ce n'est pas le cas sous Unix et je ne l'ai jamais entendu pour les répertoires. Les verrouillages obligatoires de fichiers sont couverts par POSIX, mais ils sont optionnels.

  • Très souvent, dans de tels cas, le répertoire en question se trouve sur un système de fichiers différent de celui que vous pensiez. Vous pouvez savoir lequel, avec la commande df directory (Je pense que c'est la même chose sous OS-X).

  • Vous pouvez inspecter plus en profondeur avec des outils comme stat o statfs sur le répertoire. Cependant, ces outils sont un peu bas de gamme pour les personnes normales, et bien souvent, ils sont bien cachés aux utilisateurs normaux.

  • Les répertoires peuvent contenir des fichiers avec des noms bizarres. Comme un fichier qui efface immédiatement la sortie du terminal, pour faire croire qu'il n'est pas là. Essayez quelque chose comme ls -al | less ou utiliser quelque chose comme MidnightCommander mc .

Il y a une foule d'autres possibilités, y compris les insectes, les haxors, les extraterrestres, ou peut-être des choses plus exotiques comme les fées. Mais en général, il n'est pas sage de commencer à chercher là, mais plutôt d'essayer de trouver l'erreur de votre côté, car "errare humanum est".

1voto

Jon Points 11

Il pourrait également s'agir d'un cas que je viens de résoudre, dans lequel un lien symbolique cassé se trouvait du côté du serveur et n'était pas visible pour le client via CIFS. Le lien symbolique peuplait un répertoire non vide, mais le client était incapable de voir ou de statuer sur le lien symbolique dans le but de vider le répertoire avant de le délier. Puisqu'il était invisible, il créait ce paradoxe où, du côté du client, il était vide mais "non vide" lorsqu'il était interrogé par l'utilisateur. rm . Si vous avez un accès SSH au serveur, essayez un Shell de ce côté et voyez si le répertoire est vraiment vide ou s'il peut avoir des liens symboliques cassés. J'ai pu faire cela sur un Drobo5N et cela m'a sauvé les fesses.

0voto

contre_force Points 1

Essayez d'ouvrir ce répertoire depuis Windows, il peut y avoir quelque chose qui n'apparaît pas dans Mac OS. J'ai eu un problème similaire après un certain nombre d'opérations de copie entre Mac et Win PC : le répertoire était vide même dans le terminal mais sous Windows j'ai trouvé un fichier caché de Windows, donc j'ai réussi à supprimer le répertoire de là.

0voto

OuzoPower Points 204

Dans le terminal :

  1. entrez sudo su (L'invite de la ligne de commande devrait se transformer en quelque chose comme sh-3.2# .)
  2. naviguer vers le dossier parent de celui que vous voulez supprimer
  3. entrez rm -rf TheDirectoryYouWantToDelete

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