同一父目录中具有相同名称的文件和目录 - Solaris 8、ufs
-
01-07-2019 - |
题
好吧,我使用 Solaris 已有 10 多年了,但从未见过这个......
我有一个目录列表,其中包括同名的文件和子目录:
-rw-r--r-- 1 root other 15922214 Nov 29 2006 msheehan
drwxrwxrwx 12 msheehan sysadmin 2048 Mar 25 15:39 msheehan
我使用 file 来发现文件的内容,我得到:
bash-2.03# file msheehan
msheehan: directory
bash-2.03# file msh*
msheehan: ascii text
msheehan: directory
我不担心该文件,但我想保留目录,所以我尝试 rm:
bash-2.03# rm msheehan
rm: msheehan is a directory
所以这是我的两部分问题:
- 这是怎么回事?
- 如何小心删除该文件?
乔纳森
编辑:感谢大家的回答,(到目前为止)都很有帮助,但是将列表传递给编辑器就成功了,唉:
bash-2.03# ls -l > jb.txt
bash-2.03# vi jb.txt
其中包含:
-rw-r--r-- 1 root other 15922214 Nov 29 2006 msheehab^?n
drwxrwxrwx 12 msheehan sysadmin 2048 Mar 25 15:39 msheehan
一定要小心退格键!
解决方案
我猜测这些实际上是两个“看起来”相同的不同文件名,因为当 shell 传递名称的扩展版本时,命令文件能够区分它们。尝试将 ls 通过管道传输到 od 或其他十六进制/八进制转储实用程序中,看看它们是否确实具有相同的名称,或者是否涉及非打印字符。
其他提示
我想知道什么可能导致这种情况。除了文件系统错误之外,它还可能是由以某种方式通过的非 ASCII 字符引起的。在这种情况下,请使用另一种具有更简单的字符串语义的语言来执行该操作。
看看这个 ruby 代码片段的输出是什么会很有趣:
ruby -e 'puts Dir["msheehan*"].inspect'
您可以使用 iNode 删除
如果您在“ls”中使用“-i”选项
$ 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?
我有一个示例(西班牙语)如何在 Solaris 上使用 iNode 删除文件http://sparcki.blogspot.com/2010/03/como-eliminar-archivos-utilizando-su.html
乌尔科,
以及对我自己问题的第二部分的快速回答......
我想我可以重命名目录,删除文件,然后再次将目录重命名回原来的目录。
...我仍然有兴趣看看其他人的想法。
柔佛州
我怀疑其中一个名字里有一个奇怪的字。您可以尝试使用 shell 通配符扩展来查看:类型
cat msh*
并按通配符扩展键(在我的 shell 中是 Ctrl-X *)。您应该列出两个名称,其中之一可能包含转义字符。
要查看文件中是否有特殊字符,请尝试使用Solaris 8具有这些选项的-b或-Q选项。
作为删除文件的另一个解决方案,您可以添加图形文件浏览器(gasp!),然后将不需要的文件拖动到垃圾桶中。
另一种解决方案可能是将一个文件移动到另一个名称(没有未知特殊字符的文件),然后删除带有通配符的特殊字符目录名称。
mv msheehan temp
rm mshee*
mv temp msheehan
当然,您要确保只有要删除的文件与通配符匹配。而且,对于您的特定情况,由于一个是目录,另一个是文件,因此此命令可能已经解决了所有问题:
rmdir msheeha*
查看非打印字符和空白的一种快速简便的方法是将输出通过管道传输 猫兽医, ,例如:
# ls -l | cat -vet
又好又容易记住!
对于第 2 部分,由于一个名称包含两个额外字符,因此您可以使用:
mv sheehan abc
mv sheeha??n xyz
完成此操作后,您将再次获得正常的文件名,您可以根据需要进行修复。