2008-09-17 28 views
4

Ok, je travaille avec Solaris pendant plus de 10 ans, et ne l'ai jamais vu ça ...fichier et de répertoire avec le même nom dans le même répertoire parent - Solaris 8, UFS

J'ai une liste de répertoires qui comprend à la fois un fichier et 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 le fichier pour découvrir le contenu du fichier, et je reçois:

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

Je ne suis pas inquiet sur le fichier, mais je veux pour garder le répertoire, donc J'essaie rm:

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

Voici donc ma question en deux parties:

  1. Quoi de neuf avec cela?
  2. Comment supprimer le fichier avec précaution?

Jonathan

Edit: Merci pour les gars réponses, à la fois (à ce jour) ont été utiles, mais redirigeant la liste à un éditeur a fait le tour, ala:

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

contenant :

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

Soyez toujours prudent avec la touche de retour arrière!

+0

Oh, quel problème intéressant, heureux que vous avez pensé à elle! +1 –

Répondre

6

Je suppose qu'il s'agit en fait de deux noms de fichiers différents qui "ressemblent", car le fichier de commande a pu les distinguer lorsque le shell a transmis les versions étendues du nom. Essayez de ls dans od ou autre Utilitaire de vidage hex/octal pour voir s'ils ont vraiment le même nom, ou s'il y a des caractères non-impression impliqués.

0

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

J'imagine que je pourrais renommer le répertoire, supprimez le fichier, et renommer le répertoire revenir est original à nouveau.

... Je serais toujours intéressé de voir ce que d'autres personnes proposent.

JB

0

Je soupçonne que l'un d'eux a un étrange personnage au nom. Vous pouvez essayer d'utiliser l'extension générique du shell pour voir que: le type

cat msh* 

et appuyez sur la touche d'extension générique (dans ma coquille, il est * Ctrl-X). Vous devriez avoir deux noms listés, peut-être dont l'un a un caractère d'échappement.

+0

Bon appel. @Jonathan Bourke, qu'est-ce qu'un "for f in *; echo" t $ {f} t "; fait vous donner? –

+0

Hmm ... bien que le deuxième" fichier "sortie dans la question suggère que ce n'est peut-être pas le cas ... Je suis confus –

1

Je me demande ce qui pourrait causer cela. Mis à part les bogues de système de fichiers, il pourrait être causé par un caractère non-ascii qui a traversé d'une manière ou d'une autre. Dans ce cas, utilisez un autre langage 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' 
+0

Pas de ruby ​​installé sur ce serveur, et comme c'est un système de base de données de production critique, je pense que je vais le laisser tranquille pour le moment. bien ... JB –

0

Pour voir s'il y a des caractères spéciaux dans votre fichier, essayez les options -b ou -q ls, En supposant que Solaris 8 a ces options.

Comme une autre solution à la suppression du fichier, vous pouvez afficher le navigateur de fichiers graphique (gasp!) Et faites glisser et déposer le fichier non désiré dans la corbeille.

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

mv msheehan temp 
rm mshee* 
mv temp msheehan 

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

rmdir msheeha* 
0

Une façon rapide et facile de voir des caractères non-impression et des espaces est pour redirigez la sortie vers chat -vet, par exemple:

 
# ls -l | cat -vet 

Nice et facile à retenir!

0

Pour la partie 2, car 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 les noms de fichiers sains d'esprit, que vous pouvez réparer comme vous avoir besoin.

1

Vous pouvez supprimer à l'aide du iNode

Si vous utilisez l'option « -i » 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) comment vous pouvez supprimer un fichier en utilisant puis iNode sur Solaris http://sparcki.blogspot.com/2010/03/como-eliminar-archivos-utilizando-su.html

Urko,