同一父目录中同名的文件和目录 - Solaris 8、ufs

File and directory with same name in same parent directory - Solaris 8, ufs

提问人:Jonathan Bourke 提问时间:9/17/2008 最后编辑:Brian Tompsett - 汤莱恩Jonathan Bourke 更新时间:7/1/2015 访问量:2980

问:

好的,我已经使用 Solaris 工作了 10+ 年,从未见过这个......

我有一个目录列表,其中包括一个同名的文件和子目录:

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

我使用文件来发现文件的内容,我得到:

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

因此,这是我的两部分问题:

  1. 这是怎么回事?
  2. 如何小心地删除文件?

乔纳森

编辑: 谢谢你们的回答,两者(到目前为止)都很有帮助,但是将列表传递给编辑就行了,唉:

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

始终小心退格键!

文件 目录 FileSystems Solaris

评论

0赞 Alix Axel 8/9/2011
哦,多么有趣的问题,很高兴你弄清楚了!+1

答:

0赞 Jonathan Bourke 9/17/2008 #1

以及我自己问题的第 2 部分的快速回答......

我想我可以重命名目录,删除文件,然后再次将目录重命名回原来的目录。

...我仍然有兴趣看看其他人想出什么。

新山

0赞 Anthony Williams 9/17/2008 #2

我怀疑其中一个名字中有一个奇怪的字符。您可以尝试使用 shell 通配符扩展来查看: type

cat msh*

并按通配符扩展键(在我的 shell 中是 Ctrl-X *)。您应该列出两个名字,也许其中一个名字中有一个转义字符。

评论

0赞 Blair Conrad 9/17/2008
好电话。@Jonathan Bourke,什么是“for f in *;做回声 “t${f}t”;做完了给你?
0赞 Blair Conrad 9/17/2008
嗯。。。尽管问题中的第二个“文件”输出表明情况可能并非如此......我很困惑。
6赞 wnoise 9/17/2008 #3

我猜这实际上是两个不同的文件名,它们“看起来”相同,因为当 shell 传入名称的扩展版本时,命令文件能够区分它们。尝试将 ls 管道连接到 od 或其他十六进制/八进制转储实用程序中,以查看它们是否真的具有相同的名称,或者是否涉及非打印字符。

1赞 bltxd 9/17/2008 #4

我想知道是什么原因导致的。除了文件系统错误之外,它还可能是由以某种方式通过的非 ascii 字符引起的。在这种情况下,请使用另一种具有更简单字符串语义的语言来执行操作。

看看这个 ruby 片段的输出会很有趣:

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

评论

0赞 Jonathan Bourke 9/17/2008
这台服务器上没有安装 ruby,而且由于它是一个关键的生产数据库系统,我想我暂时不理会它。不过,这个问题问得不错,也占据了我的脑海......新山
0赞 Alan H 9/18/2008 #5

要查看文件中是否有特殊字符,请尝试使用 ls、 -b 或 -q 选项, 假设 Solaris 8 具有这些选项。

作为删除文件的另一种解决方案,您可以调出图形文件浏览器 (倒吸一口凉气!并将不需要的文件拖放到废纸篓。

另一种解决方案可能是将一个文件移动到其他名称(没有未知特殊字符的文件),然后删除带有通配符的特殊字符目录名称。

mv msheehan temp
rm mshee*
mv temp msheehan

当然,您希望确保只有要删除的文件与通配符匹配。 而且,对于您的特定情况,由于一个是目录,另一个是文件,因此此命令可能已经解决了所有问题:

rmdir msheeha*
0赞 TLS 9/20/2008 #6

查看非打印字符和空格的一种快速简便的方法是通过 cat -vet 传输输出,例如:

# ls -l | cat -vet

很好,很容易记住!

0赞 Jonathan Leffler 10/13/2008 #7

对于第 2 部分,由于一个名称包含两个额外的字符,因此可以使用:

mv sheehan abc
mv sheeha??n xyz

一旦你这样做了,你就有了健康的文件名,你可以根据需要进行修复。

1赞 itilys 11/18/2010 #8

您可以使用 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

乌尔科,