在 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 #