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

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

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

答案1

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

因此,您不能同时在同一个目录中拥有同名的两个文件。

如果可以的话,程序员的生活就会变得很悲惨。当有人想要创建一个目录并检查它是否存在时,你希望命令“isDir”返回什么。isDir("/home/shrodingers/cat") 应该返回 true、false 还是两者都返回?如果有人想在某个代码中打开某个文件的目录,你会期望什么?

当你告诉系统打开某个文件时,系统应该做什么?假设你想要这个文件?那就麻烦了;)

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

我们与 Windows 相比有一个不同之处:我们使用区分大小写的名称。因此“MYFILE”和“myfile”是不同的。

答案2

您不能在同一位置拥有两个同名的实体。当您想 cat 或 vi 文件时会发生什么?操作系统会选择哪个实体?因此,由于可能造成混淆,您不能在同一位置拥有同名的文件和文件夹。顺便说一下,文件夹是托管其他文件的文件。

答案3

我知道这是一个老话题,但我刚刚遇到了同样的问题,我想分享一下。
这是我的故事(耐心等待,结局会很美好)。

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

怎么会发生这种事?
我有几台机器使用 syncthing 共享一个文件夹。过去某个时候,我删除了一个名为“.stfolder”的文件,并创建了一个同名的目录。所以这个错误可能是由于 syncthing 在另一台机器上同步此操作造成的。

现在让我们检查一下这个错误:(我担任这里)

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

看起来文件是幽灵,但是文件夹正在正常响应(使用查找)

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 输出中看到的那样,该文件同时存在和不存在。因此薛定谔猫能力,我们可以创建一个同名的文件夹。
但等等,还有更多(你应该会发现这很明显):我们也可以创建另一个同名的文件。

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 等进行操作。唯一的限制是你无法命名它,所以你必须把它放在一个空目录中,并使用“。*”作为这些命令的参数……但它有效!

由于其本质,该文件从一开始就是空的(它只是 syncthing 的一个标志)。
所以我很好奇是否可以将一些数据放入该文件中。
在这里,我想到了解决方案:

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

是的,该文件中有一个不可见的字符,就在点后面。
这解释了一切。
谢天谢地,我没有使用“echo test >> .*”和 cat...

答案4

https://unix.stackexchange.com/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

哇哦,替代响应两个具有相同名称的文件,甚至不再是目录和文件到底是怎么回事 ???_

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 # 

相关内容