Fichier et répertoire portant le même nom dans le même répertoire parent - Solaris 8, ufs

StackOverflow https://stackoverflow.com/questions/83156

Question

D'accord, je travaille avec Solaris depuis plus de 10 ans et je n'ai jamais vu cela ...

J'ai une liste de répertoires qui comprend un fichier et un sous-répertoire du même nom:

-rw-r--r--   1 root     other    15922214 Nov 29  2006 msheehan
drwxrwxrwx  12 msheehan sysadmin    2048 Mar 25 15:39 msheehan

J'utilise un fichier pour découvrir le contenu du fichier et j'obtiens:

bash-2.03# file msheehan
msheehan:       directory
bash-2.03# file msh*
msheehan:      ascii text
msheehan:       directory

Je ne m'inquiète pas pour le fichier, mais je veux conserver le répertoire. J'essaie donc rm:

bash-2.03# rm msheehan
rm: msheehan is a directory

Voici donc ma question en deux parties:

  1. Qu'est-ce qui se passe avec ça?
  2. Comment puis-je supprimer soigneusement le fichier?

Jonathan

Modifier: Merci pour les réponses, les deux (jusqu’à présent) ont été utiles, mais l’affichage de la liste à un éditeur a fonctionné, ala:

bash-2.03# ls -l > jb.txt
bash-2.03# vi jb.txt

Ce qui contenait:

-rw-r--r--   1 root     other    15922214 Nov 29  2006 msheehab^?n
drwxrwxrwx  12 msheehan sysadmin    2048 Mar 25 15:39 msheehan

Faites toujours attention avec la touche Retour arrière!

Était-ce utile?

La solution

Je suppose que ce sont en fait deux noms de fichiers différents qui "ressemblent" De la même façon, le fichier de commande était capable de les distinguer lorsque le shell passait les versions développées du nom. Essayez de lacer piping dans od ou un autre utilitaire de vidage hexadécal / octal pour voir s’ils ont vraiment le même nom, ou s’il existe. caractères non imprimables impliqués.

Autres conseils

Je me demande ce qui pourrait causer cela. Mis à part les bogues du système de fichiers, cela pourrait être dû à un caractère non ascii qui a traversé. Dans ce cas, utilisez une autre langue avec une sémantique de chaîne plus simple pour effectuer l'opération.

Il serait intéressant de voir quelle serait la sortie de cet extrait de rubis:

ruby -e 'puts Dir["msheehan*"].inspect'

Vous pouvez supprimer à l'aide de l'iNode

Si vous utilisez les " -i " option dans "ls"

$ ls -li
total 1
20801 -rw-r--r-- 1 root root 0 2010-11-08 01:55 a?
20802 -rw-r--r-- 1 root root 0 2010-11-08 01:55 a\?
$ find . -inum 20802 -exec rm {} \;
$ ls -li
total 1
20801 -rw-r--r-- 1 root root 0 2010-11-08 01:55 a?

J'ai un exemple (en espagnol) sur la manière de supprimer un fichier à l'aide de iNode sous Solaris. http://sparcki.blogspot.com/2010/03 /como-eliminar-archivos-utilizando-su.html

Urko,

Et une réponse rapide à la partie 2 de ma propre question ...

J'imagine que je pourrais renommer le répertoire, supprimer le fichier et le renommer à nouveau.

... Je serais toujours intéressé de voir ce que les autres trouveraient.

JB

Je soupçonne que l’un d’eux a un caractère étrange dans son nom. Vous pouvez essayer d’utiliser l’extension générique du shell pour voir ce qui suit: tapez

cat msh*

et appuyez sur la touche d'extension générique (dans mon shell, il s'agit de Ctrl-X *). Vous devriez obtenir deux noms, dont l’un peut comporter un caractère d’échappement.

Pour voir s’il y a des caractères spéciaux dans votre fichier, essayez les options -b ou -q de ls, en supposant que solaris 8 dispose de ces options.

Comme autre solution pour supprimer le fichier, vous pouvez afficher le navigateur de fichiers graphique. (halète!) et faites glisser le fichier indésirable dans la corbeille.

Une autre solution pourrait consister à déplacer un fichier sous un nom différent (celui sans le caractère spécial inconnu), puis à supprimer le nom du répertoire des caractères spéciaux avec des caractères génériques.

mv msheehan temp
rm mshee*
mv temp msheehan

Bien sûr, vous voulez vous assurer que seul le fichier que vous souhaitez supprimer correspond au caractère générique. Et, dans votre cas particulier, puisque l’un était un répertoire et l’autre un fichier, cette commande aurait peut-être tout résolu:

rmdir msheeha*

Un moyen simple et rapide de voir les caractères non imprimables et les espaces est de diriger la sortie vers cat -vet , par exemple:

.
# ls -l | cat -vet

Sympa et facile à retenir!

Pour la partie 2, puisqu'un nom contient deux caractères supplémentaires, vous pouvez utiliser:

mv sheehan abc
mv sheeha??n xyz

Une fois que vous avez fait cela, vous avez à nouveau des noms de fichiers sains, que vous pouvez corriger en fonction de vos besoins.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top