相同位置的相同文件夹和文件名


15

在Ubuntu中,为什么不能在同一位置放置一个名为“ MyFile”的文件夹和一个名为“ MyFile”的文档?我得到一个item already used in this location错误。Ubuntu / Linux是否将文件夹和文件视为相同的对象(指向磁盘的指针)?


就是这样命名吗?文件名中是否有前导点?例如,.myfile
Sergiy Kolodyazhnyy 2015年

我有同样的问题。我改名了。有几个选项:将文件夹重命名为小写或添加扩展名,例如-myfile或My.File。或将文件重命名为MyFile.txt。重命名任何一个都将同样有效。
降压


我分享你的无奈。我正在构建一个静态网站,所以我无法拥有一个本地版本,该版本的文件夹中blog包含带有博客文章的文件夹,以及一个blog带有博客文章列表的html页面。
哥斯达黎加

Answers:


29

在Linux中,几乎所有内容都是文件描述符。目录是一种特殊类型的文件,从用户的角度来看,它可以保存其他文件。

因此,您不能同时在同一目录中拥有相同的名字。

如果可以的话,编码人员的生活将变得痛苦不堪。当有人要创建目录并检查目录是否存在时,将返回命令“ isDir”。isDir(“ / home / shrodingers / cat”)应该返回true,false还是两者都返回?如果有人想用一些代码打开文件的目录,您会期望什么?

当您告诉系统打开某些内容时,系统应该怎么做?假设您要文件?这意味着麻烦;)

顺便说一句:这适用于所有操作系统,而不仅仅是Linux。尽管从桌面的角度来看,操作系统可以向文件或目录添加唯一标识符,然后将其从列表中删除。从命令行的角度来看,这将是有问题的。

在Windows上有一件事:我们使用区分大小写的名称。所以“ MYFILE”和“ myfile”是不同的东西。


2
没问题:)我是为赞成投票的;-)
Rinzwind

1
@Rinzwind支持投票吗?好的,这是另一个
AB

1
Linux万物理论:万物皆文件!
字节指挥官

我和安东(Anthon)在四个月前合作开了薛定ding的猫/两个人都在开玩笑。而且,正如Byte Commander所说的,表达式是“一切都是文件”,而不是“一切都是文件描述符”。
G-Man说'恢复莫妮卡'

1
Plan9(plan9.bell-labs.com/plan9)(Unix的原始创建者)可能是唯一“一切都是文件”的操作系统。对于所有其他Unix和Linux系统,正确的短语是“一切都是文件描述符”。“所有内容都是文件”,除了内存,系统调用,网络设备以及除文件之外的几乎所有内容,但它们都有文件描述符;-)如果有人要继续进行此操作-> chat:=)
Rinzwind

1

您不能在同一位置拥有两个具有相同名称的实体。当您想获取文件或vi文件时会发生什么?操作系统会选择巫婆实体吗?因此,由于混淆的可能,您将无法在同一位置使用相同名称的文件和文件夹。顺便说一句,文件夹是托管其他文件的文件。


3
您的回答将OP的问题反传回他的脸(“您不能在同一位置拥有两个具有相同名称的实体”,他/她已经清楚地知道了-问题是“为什么?”),然后您问一些修辞问题。 ,好像他们无法回答,就解决了这个问题。如果我有一个文件和一个具有相同名称的目录,并且我catvi那个名称,那么很明显,操作系统应该选择该文件。为什么那行不通?
G-Man说'恢复莫妮卡'

2
@ G-Man:实际上vi,通常vim在Ubuntu上,它非常乐意打开并显示目录甚至进行编辑。尝试一下: vi .
arielf

1
@arielf:(1)I是说,如果它可以为一个文件,并具有相同名称的子目录在同一目录存在,那么当一个(主要)面向文件的命令,例如catvi寻址到该名称,逻辑解释是在文件而不是子目录上调用它。(主要)面向文件的命令(vi)也可用于(子)目录的事实与该语句无关。
G-Man说'恢复莫妮卡'

1
(2)您的发言是鲱鱼。vim没有天真地对待子目录参数;具有与处理文件相同的代码。  vim似乎(在一个非常简单的级别上)将两个程序合而为一:如果在文件上调用它,则其作用类似于文本编辑器;如果在子目录上调用,则其作用类似于文件管理器。
G-Man说“恢复莫妮卡”

1
@ G-Man:我只是在第一条评论中提到您的最后一个断言:“那么,显然,操作系统应该选择文件。” -那真是令我震惊vi。干杯。
arielf

1

我知道这是一个老话题,但是我只是遇到了同样的问题,我想分享一下。
这是我的故事(请耐心等待,祝大家生活愉快)。

环境:
reiserfs上的Gentoo内核4.12.5 64位

这怎么可能发生?
我有几台使用同步共享文件夹的机器。在过去的某个时候,我删除了一个名为“ .stfolder”的文件,而是使用该名称创建了一个目录。因此,也许该错误是由于在另一台计算机上同步此操作而引起的。

现在,让我们检查一下该错误:(我在这里以root用户身份运行)

ls -lahd .*
drwxrwx--- 5 stopi syncthing 656  3 sept. 18:24 .
drwxr-xr-x 5 stopi stopi     240  3 sept. 18:21 ..
drw-rw---- 2 stopi syncthing  48  3 sept. 18:24 .stfolder
-rw-rw---- 1 stopi syncthing   0 29 août  12:51 .stfolder
-rw-rw---- 1 stopi syncthing  23 28 oct.   2017 .stignore

find -type f -name .stfolder
                              (<= no output there)

find -type f -name ".*"
./.stignore
./.stfolder

find -type f -name ".s*"
./.stignore

看起来文件是鬼,但是文件夹正常应答(使用find)

file .*
.:             directory
..:            directory
.stfolder:     directory
.stfolder:     empty
.stignore:     C source, ASCII text

file .s*
.stfolder:     directory
.stignore:     C source, ASCII text

我知道,很奇怪

rm -r .stfolder

ls -lahd .*
drwxrwx--- 5 stopi syncthing 656  3 sept. 18:24 .
drwxr-xr-x 5 stopi stopi     240  3 sept. 18:21 ..
-rw-rw---- 1 stopi syncthing   0 29 août  12:51 .stfolder
-rw-rw---- 1 stopi syncthing  23 28 oct.   2017 .stignore

rm .stfolder
rm: impossible de supprimer '.stfolder': Aucun fichier ou dossier de ce type

我无法删除该幻影文件!

但最后,我已经成功地通过将其移动到tmpfs挂载点上将其删除

mv .stfolder /elsewhere/
mv: impossible d'évaluer '.stfolder': Aucun fichier ou dossier de ce type
mv .* /elsewhere/

我必须说该错误仍然存​​在于tmpfs上,因此与reiserfs无关:

cd /elsewhere

ls -lahd .*
-rw-rw----  1 stopi syncthing   0 29 août  12:51 .stfolder

ls -lahd .s*
ls: impossible d'accéder à '.s*': Aucun fichier ou dossier de ce type

如您在此bash输出中所见,该文件同时存在和不存在。由于具有Schrödinger猫的能力,我们可以创建一个具有相同名称的文件夹。
但是,等等,还有更多(您应该发现这一点很明显):我们也可以创建另一个具有相同名称的文件。

touch .stfolder

ls -lahdQ
total 0
drwxrwxr-x  3 root   users  100  3 sept. 19:13 "."
drwxrwxrwt 18 root   root   440  3 sept. 17:35 ".."
-rw-r--r--  1 root   root     0  3 sept. 19:13 ".stfolder"
-rw-r-----  1 root   root     0  3 sept. 19:09 ".stfolder"

可以复制幻影(以便复制错误),也可以通过chown,chmod等操作。唯一的限制是您无法命名它,因此必须将其放置在空目录中并使用“。*”作为这些命令的参数...但是可以用!

由于它的本质,该文件从一开始就是空的(它只是同步的标志)。
因此,我很想知道是否可以在该文件中放入一些数据。
在这里,解决方案来到我这里:

vi .*
" ============================================================================
" Netrw Directory Listing                                        (netrw v162)
"   /elsewhere
"   Sorted by      name
"   Sort sequence: [\/]$,\<core\%(\.\d\+\)\=\>,\.h$,\.c$,\.cpp$,\~\=\*$,*,\.o$,\.obj$,\.info$,\.swp$,\.bak$,\~$
"   Quick Help: <F1>:help  -:go up dir  D:delete  R:rename  s:sort-by  x:special
" ==============================================================================
../
./
.<200b>stfolder

是的,该文件中的点后面紧跟着一个不可见的字符。
这说明了一切。
谢谢上帝,我没有使用“回声测试>>。*”,而是...


U+200b顺便说一下,是一个“零宽度空间”。我喜欢这个轶事,尽管我担心它可能无法完全算作答案。
PerlDuck

0

/unix//a/238056/139805

哇,这真的很奇怪,但是我只是按照作者的要求做了。这就是方法,所以这是一个真实的答案:P

charles@charles-MacBook ~ $ cd /usr/share
charles@charles-MacBook /usr/share $ ls -ld pix*
drwxr-xr-x 13 root root  4096 Oct 22 21:04 pixmaps
-rw-r--r--  1 root root 17626 Oct 22 21:07 pixmaps 
charles@charles-MacBook /usr/share $ mv pixmaps pixmaps
mv: cannot move ‘pixmaps’ to a subdirectory of itself, ‘pixmaps/pixmaps’
charles@charles-MacBook /usr/share $ ls -ld pix*
drwxr-xr-x 13 root root  4096 Oct 22 21:04 pixmaps
-rw-r--r--  1 root root 17626 Oct 22 21:07 pixmaps 
charles@charles-MacBook /usr/share $ file pix*
pixmaps:  directory
pixmaps : X pixmap image, ASCII text

这是通过以下方式完成的:

charles-MacBook MaSSH # ls
instMaSSH.sh  MaSSHandra  MaSSHandra.desktop  MaSSHandraMesh.xpm
MaSSHandra.xpm  mime-MaSSHandra.xml
charles-MacBook MaSSH # cat instMaSSH.sh 
cp -i MaSSHandra.desktop /usr/share/applications
cp -i MaSSHandra.xpm /usr/share/pixmaps 
cp -i MaSSHandraMesh.xpm /usr/share/pixmaps
xdg-icon-resource install --context mimetypes --size 48 /usr/share/pixmaps/MaSSHandra.xpm application-x-MaSSHandra
xdg-icon-resource install --context mimetypes --size 48 /usr/share/pixmaps/MaSSHandraMesh.xpm application-x-MaSSHandraMesh
setcap cap_net_raw+ep /opt/MaSSHandra/bin/MaSSHandra
charles-MacBook MaSSH # ./instMaSSH.sh 
cp: overwrite ‘/usr/share/applications/MaSSHandra.desktop’? y
xdg-icon-resource: file '/usr/share/pixmaps/MaSSHandra.xpm' does not exist
xdg-icon-resource: file '/usr/share/pixmaps/MaSSHandraMesh.xpm' does not exist

whoah交替响应两个具有相同名称的文件,甚至没有目录和文件,这是怎么回事?

charles-MacBook share # ls -ld pi*
drwxr-xr-x 13 root root  4096 Oct 22 21:08 pixmaps
-rw-r--r--  1 root root 17626 Oct 22 21:09 pixmaps 
charles-MacBook share # mv pixmaps /tmp
charles-MacBook share # mv pixmaps  /tmp/pixmaps/
charles-MacBook share # ls -ld pix*
-rw-r--r-- 1 root root 21535 Oct 22 21:26 pixmaps
-rw-r--r-- 1 root root 17626 Oct 22 21:26 pixmaps 
charles-MacBook share # ls -li pix*
1849351 -rw-r--r-- 1 root root 21535 Oct 22 21:26 pixmaps
1841386 -rw-r--r-- 1 root root 17626 Oct 22 21:26 pixmaps 
charles-MacBook share # file pix*
pixmaps:  X pixmap image, ASCII text
pixmaps : X pixmap image, ASCII text
charles-MacBook share # ls -liF pix*
1849351 -rw-r--r-- 1 root root 21535 Oct 22 21:26 pixmaps
1841386 -rw-r--r-- 1 root root 17626 Oct 22 21:26 pixmaps 

完全奇怪的行为

charles-MacBook MaSSH # ls -l /usr/share/pixmaps
pixmaps   pixmaps   
charles-MacBook MaSSH # rm -i /usr/share/pixmaps                                                                 
rm: remove regular file ‘/usr/share/pixmaps’? y
charles-MacBook MaSSH # ls -l /usr/share/pixmaps  
-rw-r--r-- 1 root root 17626 Oct 22 21:26 /usr/share/pixmaps 
charles-MacBook MaSSH # rm -i /usr/share/pixmaps
rm: cannot remove ‘/usr/share/pixmaps’: No such file or directory
charles-MacBook MaSSH # ls -l /usr/share/pixmaps  
-rw-r--r-- 1 root root 17626 Oct 22 21:26 /usr/share/pixmaps 
charles-MacBook MaSSH # cd /usr/share
charles-MacBook share # rm pixmaps  
charles-MacBook share # 

2
这两个名称之一在末尾具有某种形式的空格。您可以在“文件”输出中分辨出来。
dascandy '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.