Fichier et répertoire portant le même nom dans le même répertoire parent - Solaris 8, ufs
-
01-07-2019 - |
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:
- Qu'est-ce qui se passe avec ça?
- 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!
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.