J'ai décompressé un fichier tar corrompu et j'ai réussi à me retrouver avec un répertoire que je ne peux pas supprimer. Si j'essaie de le supprimer, il semble qu'il ne puisse pas être trouvé, mais ls
il est présent, à la fois avec bash et avec python. comportement similaire, sauf juste après que j'essaie de le supprimer avec rm -rf
, se ls
plaint qu'il ne peut pas le trouver, puis il le répertorie (voir ci-dessous après rm -rf
). La find
commande indique que le fichier est présent, mais je ne trouve toujours pas de moyen de le supprimer.
Voici mes tentatives:
Ici vous voyez les deux ls
et find
convenez que nous avons un répertoire,
rl]$ ls
mikeaâ??cnt
rl]$ find -maxdepth 1 -type d -empty -print0
./mikeaâcnt
Mais je ne peux pas le supprimer:
rl]$ find -maxdepth 1 -type d -empty -print0 | xargs -0 rm -f -v
rm: cannot remove `./mikeaâ\302\201\302\204cnt': Is a directory
rl]$ ls
mikeaâ??cnt
Je peux le cd
faire et c'est vide:
rl]$ cd mikeaâ^Á^Äcnt/
mikeaâ^Á^Äcnt]$ ls
mikeaâ^Á^Äcnt]$ pwd
.../rl/mikeaâcnt
mikeaâ^Á^Äcnt]$ cd ../
rl]$ ls
mikeaâ??cnt
voyez ci-dessous qu'il ne s'agit pas d'un fichier simple mais d'un répertoire. De plus, il ls
se comporte de manière amusante après rm -rf
qu'il indique qu'il ne trouve pas le fichier, puis le répertorie directement après:
rl]$ rm mikeaâ^Á^Äcnt/
rm: cannot remove `mikeaâ\302\201\302\204cnt/': Is a directory
rl]$ rm -rf mikeaâ^Á^Äcnt/
rl]$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt
rl]$
Il s’agit donc d’une tentative avec python, le fichier est trouvé, mais le nom ne peut pas être utilisé comme nom pouvant être supprimé:
rl]$ python
Python 2.6.6 (r266:84292, Jul 10 2013, 22:48:45)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> import shutil
>>> os.listdir('.')
['mikea\xc3\xa2\xc2\x81\xc2\x84cnt']
>>> shutil.rmtree(os.listdir('.')[0] )
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib64/python2.6/shutil.py", line 204, in rmtree
onerror(os.listdir, path, sys.exc_info())
File "/usr/lib64/python2.6/shutil.py", line 202, in rmtree
names = os.listdir(path)
OSError: [Errno 2] No such file or directory: 'mikea\xc3\xa2\xc2\x81\xc2\x84cnt'
même lorsque j'utilise l'onglet de complétion, le nom qu'il prend n'est pas utilisable:
rl]$ rm -rf mikeaâ^Á^Äcnt
rl]$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt
en utilisant le nom que python montre avec bash, je reçois ceci:
rl]$ rm -rf "mikea\xc3\xa2\xc2\x81\xc2\x84cnt"
rl]$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt
Y a-t-il quelque chose que je puisse faire pour me débarrasser de ce répertoire corrompu? Le système de fichiers sous-jacent (NFS) semble fonctionnel et aucun autre problème n'a été signalé. Je n'ai eu aucun problème de ce type jusqu'à ce que le fichier tar corrompu.
EDIT: Ici, vous utilisez votre find
propre -exec
option pour appelerrm
rl]$ find -maxdepth 1 -type d -empty -exec rm -f {} \;
find: `./mikeaâ\302\201\302\204cnt': No such file or directory
rl]$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt
rl]$
mais le fichier est toujours là (se ls
plaint de ne pas pouvoir le trouver, mais le montre quand même)
2e édition:
rl]$ find -maxdepth 1 -type d -empty -exec rm -rf {} \;
find: `./mikeaâ\302\201\302\204cnt': No such file or directory
rl]$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt
Le comportement est toujours inchangé, le fichier est toujours présent
3ème EDIT:
rl]$ ls
mikeaâ??cnt
rl]$ find -maxdepth 1 -type d -empty -exec rm -rf {} +
rl]$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt
Il semble y avoir plus dans le nom que mikeaâcnt
de regarder le résultat de la tentative python mikea\xc3\xa2\xc2\x81\xc2\x84cnt
et cette capture d'écran:
4ème EDIT: Ceci est la tentative avec un joker:
rl]$ echo *
mikeaâcnt
rl]$ echo mike*
mikeaâcnt
rl]$ rm -rf mike*
rl]$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt
et mon lieu:
rl]$ locale
LANG=en_US.utf8
LC_CTYPE="en_US.utf8"
LC_NUMERIC="en_US.utf8"
LC_TIME="en_US.utf8"
LC_COLLATE="en_US.utf8"
LC_MONETARY="en_US.utf8"
LC_MESSAGES="en_US.utf8"
LC_PAPER="en_US.utf8"
LC_NAME="en_US.utf8"
LC_ADDRESS="en_US.utf8"
LC_TELEPHONE="en_US.utf8"
LC_MEASUREMENT="en_US.utf8"
LC_IDENTIFICATION="en_US.utf8"
LC_ALL=
5ème édition:
rl]$ ls -i
ls: cannot access mikeaâcnt: No such file or directory
? mikeaâ??cnt
mais aussi le comportement a changé, maintenant ls
et cd
fais ceci:
rl]$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt
rl]$ cd mikeaâ^Á^Äcnt
mikeaâcnt: No such file or directory.
Ce qui est arrivé après les tentatives de suppression, je pense qu'il pourrait y avoir des problèmes NFS comme suggéré dans l' une des réponses ici par vinc17.
6ème EDIT: Ceci est la sortie de lsof
etls -a
rl] $ / usr / sbin / lsof mikeaâ ^ Á ^ Äcnt lsof: erreur d'état sur mikeaâ \ xc2 \ x81 \ xc2 \ x84cnt: aucun fichier ou répertoire de ce type
ci-dessus est faux, voici l' lsof
appel correct : (rl est le répertoire parent)
rl]$ /usr/sbin/lsof | grep mike | grep rl
tcsh 11926 mike cwd DIR 0,33 4096 19569249 /home/mike/mish/rl
lsof 14733 mike cwd DIR 0,33 4096 19569249 /home/mike/mish/rl
grep 14734 mike cwd DIR 0,33 4096 19569249 /home/mike/mish/rl
grep 14735 mike cwd DIR 0,33 4096 19569249 /home/mike/mish/rl
lsof 14736 mike cwd DIR 0,33 4096 19569249 /home/mike/mish/rl
rl]$
rl]$ ls -a
ls: cannot access mikeaâcnt: No such file or directory
. .. mikeaâ??cnt
7ème édition: mouvement ne fonctionnera pas, (je l' ai essayé avant tout cela, mais je n'ai pas sauvé la sortie), mais il a le même problème que ls
et rm
avec le fichier.
8ème EDIT: ceci utilise les caractères hexa tels que suggérés:
rl]$ ls --show-control-chars | xxd
0000000: 6d69 6b65 61c3 a2c2 81c2 8463 6e74 0a mikea......cnt.
rl]$ rmdir $'mikea\6d69\6b65\61c3\a2c2\81c2\8463\6e74\0acnt'
rmdir: failed to remove `mikea\006d69\006b651c3\a2c2\\81c2\\8463\006e74': No such file or directory
rl]$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt
rl]$
9ème édition: pour la stat
commande:
rl]$ stat mikeaâ^Á^Äcnt
stat: cannot stat `mikeaâ\302\201\302\204cnt': No such file or directory
rl]$
Cela semble encore plus probable de toutes les sorties, il y a un bogue ou une autre mauvaise conduite de NFS comme suggéré dans les commentaires.
Edit 10: Ceci est la sortie de strace dans un résumé puisque sa taille, sa sortie ou ces deux commandes:
strace -xx rmdir ./* | grep -e '-1 E'`
strace -xx -e trace=file ls -li`
https://gist.github.com/mikeatm/e07fa600747a4285e460
Edit 11: Donc, avant ce qui précède, rmdir
j'ai remarqué que je pouvais cd
entrer dans le répertoire, mais après cela, rmdir
je ne pouvais cd
plus, comme hier. Les fichiers .
et ..
étaient présents:
rl]$ ls
mikeaâ??cnt
rl]$ cd mikeaâ^Á^Äcnt/
mikeaâ^Á^Äcnt]$ ls
mikeaâ^Á^Äcnt]$ ls -a
. ..
mikeaâ^Á^Äcnt]$ cd ../
Final Edit: J'ai vu un administrateur local à ce sujet et le problème a été résolu en se connectant au serveur lui-même et en le supprimant. L'explication de ceux-ci est qu'il pourrait y avoir un problème avec les jeux de caractères du nom inappropriés.
find
la sortie vers une commande différente au lieu d'utiliser simplement sonexec
option?mv
. Peut-être que vous pourrez le supprimer après cela Vous pouvez également essayer de déplacer le répertoire vers un dossier plus profond (éventuellement avec un caractère générique), puis de supprimer le dossier dans lequel vous l'avez déplacé.Réponses:
L'extrait suivant de cet essai explique potentiellement pourquoi ce répertoire refuse d'être supprimé:
la source
Une façon de supprimer des fichiers / répertoires comme celui-ci est par leur référence d'inode.
Pour trouver les inodes des éléments dans le répertoire courant:
Pour supprimer ceci:
la source
?
pour référence inode. Comment le supprimez-vous alors?Vous ne devez pas utiliser de caractères non-ASCII dans la ligne de commande car, comme vous avez pu le constater, pour une raison quelconque, ils ne correspondront pas nécessairement au nom du fichier (Unicode propose différentes manières d’exprimer des lettres accentuées). Quelque chose comme:
devrait fonctionner puisque le nom du fichier est directement généré par le shell. Mais assurez-vous qu'il n'y a qu'une seule correspondance (faites une
echo mike*
première pour confirmer).Eh bien, si cela
cd
fonctionne, il n'y a aucune raison pourquoirm
ouls
devrait direNo such file or directory
, de sorte que le problème peut être au niveau du système de fichiers.Remarque: N'utilisez pas
ls
pour rechercher si un répertoire est vide, maisls -a
.Le répertoire peut toujours être utilisé par un autre processus (y compris s'il s'agit du cwd d'un processus). IMHO, c'est pourquoi il "existe toujours" mais peut générer des erreurs, par exemple avec
ls
;lsof
peut vous donner des informations, mais avec NFS, vous devez trouver quelle machine l’utilise. Surtout avec NFS, cela peut donner d’étranges erreurs.ls -a
dans le répertoire parent peut vous montrer des.nfs*
fichiers / répertoires dans certains cas.Quand vous obtenez:
Je soupçonne que le fichier existe toujours dans la table des répertoires en raison de la mise en cache NFS et / ou parce qu'il est utilisé par un autre processus, mais sans informations associées. Lorsque vous
ls
essayez d'obtenir des informations sur le fichier lui-même, une erreur se produit car le fichier lui-même n'existe plus (il ne se trouve que dans la table des répertoires), d'où l'erreur affichée. Puisls
sort le nom de fichier car il se trouve dans la table des répertoires. Le fait que vous ayez des points d'interrogation dans un cas mais pas dans l'autre est dû à un bug d'affichage dels
IMHO (sans rapport avec votre problème).la source
J'ai personnellement testé l'utilisation de
find
la-exec
directive:Le dossier a été correctement créé et correctement supprimé.
Comme l'a souligné @Igeorget , il existe une méthode encore plus simple si vous utilisez GNU
find
:J'ai aussi testé cette commande et elle fonctionne correctement
la source
-delete
option.J'ai eu le même problème, je crois. J'ai vu le problème plus tôt avec un nom de fichier de
☃
.ls
dans ce cas, affiche le fichier sous la formeâ??
, mais j'ai pu le supprimer avecrm ☃
.Cela m'a amené à convertir le nom incorrect en nom correct de la manière suivante:
Commencez par obtenir les octets du nom de fichier:
Décodez ensuite ces octets en UTF-8 pour obtenir les points de code Unicode, en utilisant l'entrée hexadécimale de ce site Web, par exemple: http://software.hixie.ch/utilities/cgi/unicode-decoder/utf8-decoder
Notez que tous sont en dessous de la limite d'octet. Nous obtenons les octets suivants:
Si nous traitons cette séquence à UTF-8, nous obtenons:
Et ainsi votre nom de fichier est:,
mikea⁄cnt
avec une fraction de barre oblique au lieu d'une normale. Vous pouvez maintenant passer ce nom àrmdir
.la source
Après avoir obtenu le code hexadécimal correct du nom du fichier / dossier (quelle que soit la méthode que l’on juge appropriée, je peux choisir
ls --show-control-chars | xxd
), une construction spéciale doit être utilisée pour adresser ces caractères lors de l’exécution sous bash:Sinon, les barres obliques inverses sont traitées comme des barres obliques inverses à la vanille.
la source
ls
inclut les nouvelles lignes dans les données de sortie et le "cnt" est dupliqué. Peut-être que vous pouvez essayer directement de copier et coller la ligne dans ma réponse et voir si elle est efficace?LC_*
etLANG
env) et de monter NFS sans aucune option de jeu de caractères.Avez-vous essayé d'utiliser
rm -rf ./mikeaâcnt
ourm -rf "./mikeaâcnt"
ou un chemin absolu? Aussi au lieu derm
, essayezrmdir ./mikeaâcnt
.la source
mikeaâcnt
ne semblent pas être le nom du fichier, mais ce quils
s'affiche, voir la 3ème éditionAvez-vous essayé d'obtenir l'inode de ce fichier avec
stat
:Cela devrait vous donner le numéro d’inode (et d’autres données), et vous pourrez ensuite essayer de le supprimer.
la source
stat
behavior,J'ai eu des problèmes similaires. Avez-vous Gnome, KDE ou une sorte de Xwindow DM?. Si vous ouvrez votre fichier broser et supprimez le fichier à partir de là.
Ça devrait marcher.
Je voudrais voir une solution à partir de la ligne de commande, mais dans mon cas et après avoir perdu beaucoup de temps à essayer de comprendre comment la supprimer de la ligne de commande, j’ai trouvé que c’était aussi simple que de supprimer tout autre fichier de Nautilus ou tout autre explorateur de fichiers (en réalité, j’ai seulement essayé avec Nautilus).
la source