Linux:如何创建没有“。”和“..”的目录?

Linux:如何创建没有“。”和“..”的目录?

我不确定以下问题是否特定于 busybox:我有一台安装了 busybox 的嵌入式设备。据我所知,创建目录时,通常会自动创建 2 个隐藏文件:.表示当前目录和..表示父目录。例如,通过输入mkdir -p /tmp/normal_dir; cd /tmp/normal_dir; ls -a,输出将是. ..

但是,我见过一种情况,现有目录 ( /tmp/strange_dir) 不显示...。也就是说,通过输入cd /tmp/strange_dir; ls -a,输出为空,尽管导航到父目录仍然有效。也就是说,通过输入cd ..,内容是正确的。

我的问题是:如何创建这样一个没有...(类似)的目录?我很困惑。/tmp/strange_dir

答案1

如果您通过符号链接访问目录,但链接的目录已被删除,则可能会发生这种情况。例如,在 中/tmp,让我们创建一个目录和指向该目录的符号链接:

$ cd /tmp
$ mkdir normal_dir
$ ln -s normal_dir strange_dir

现在,如果我们导航到strange_dir,我们将获得预期的输出:

$ cd strange_dir
$ ls -a
. ..

但是,如果我们删除目录normal_dir 没有改变目录,我们确实得到了一个有趣的结果:

$ rmdir /tmp/normal_dir
$ ls -a

$ ls -al
total 0

因此,尽管我们的链接现在指向的不是任何东西,但是 shell 的工作“目录”仍然是相同的:

$ pwd
/tmp/strange_dir

$ cd /tmp/strange_dir
bash: cd: /tmp/strange_dir: No such file or directory

$ ls -al
total 0

stat -L .在我们的工作目录仍然处于运行状态时/tmp/strange_dir,现在将显示Size: 0上述评论中讨论的内容。虽然 的输出ls现在什么都没有显示(甚至.没有..),但我们..在这种情况下仍然可以很好地导航到父目录,正如您概述的那样:

$ cd ..
$ pwd
/tmp

$ ls -a
. .. strange_dir

虽然符号链接仍然存在,但它没有指向任何东西,所以我们现在无法cd回到strange_dir这一点,除非目录/tmp/normal_dir已重新创建。要清理,我们只需通过调用 删除符号链接即可rm /tmp/strange_dir

答案2

可以想象,如果有人说

mkdir /tmp/strange_dir

此时文件系统已满(即没有空闲块)。仍然(可能)可以strange_dir 在 中创建目录条目/tmp,因为这只需要在已分配给 的块中留出几个字节的未使用空间/tmp。但是不可能为strange_dir自己分配一个块,因此不可能创建...条目。在这种情况下,我希望mkdir程序能够删除(取消链接)strange_dir中的目录条目/tmp,但软件并不总是按照我的期望执行。

其他可能性:

  • mkdirstrange_dir在创建目录条目/tmp 和创建之间被中断(终止)...中的条目strange_dir。我希望mkdir捕获中断信号(即Ctrl+ C)并在其后进行清理,但请参见上文关于软件和我对它的期望。当然,它无法捕获终止信号或系统崩溃。 
  • rmdir在取消链接期间被中断(终止)...中的条目strange_dir 并取消strange_dir链接中的目录条目/tmp

人们可能期望fsck在崩溃后运行的程序会检测到strange_dir并采取措施,但是......

是的,当然,如果目录的大小为 0,则意味着没有分配给它的块,因此它不能包含任何内容(即使是像...)。

我不完全理解为什么cd ..在没有的情况下会起作用..,但请参阅讨论使用命令行界面从内部删除目录.事实证明

mkdir /tmp/strange_dir
cd /tmp/strange_dir
ls -lai ←显示正常..,带有 inode 编号。
rmdir /tmp/strange_dir
密码 ←仍有报道/tmp/strange_dir
ls -lai ←显示空目录:共 0 条
ls -ldi ←演出具有与之前相同的 inode 编号,
                          但大小为 0,链接数也为 0。
光盘.. ←让你重回/tmp

这种情况与本问题中的情况并不完全类似,因为在另一种情况下,strange_dir从中移除/tmp。但它表明这cd ..是特殊的,有时在没有明显机制的情况下也能发挥作用。

pwd 和 /bin/pwd 之间的奇怪区别表明了这种做法可能如何运作。shell 会跟踪当前目录。也就是说,它会跟踪当前目录的最佳猜测。它可能会受到符号链接和类似以下技巧的欺骗

mkdir /tmp/foo
cd /tmp/foo
mv /tmp/foo /tmp/foobar

也就是说,它仍然会认为当前目录是/tmp/foo,所以pwd会报告 ,但pwd -P/bin/pwd会报告/tmp/foobar。因此,如果失败,shell 可能会chdir("..")计算它认为你的下一级目录应该是什么,并绝对转到那里。(但我怀疑事情不止于此。)

答案3

感谢迄今为止的讨论。以下是我的一位非超级用户社区成员的同事的解释:

/tmp/strange_dir在我的情况下是 NBD/VFS(网络块设备/虚拟文件系统)目录。这种类型的虚拟文件系统与更传统的文件系统不同,并且有自己的 shell 命令实现。因此,当目录为空时,ls -a什么也不显示,但cd ..允许向上转到其父目录,这并不奇怪。

相关内容