我的文件系统上有一个 not-quite-folder not-quite-file。它是一个运行 Ubuntu 18.04.4 LTS 的 AWS EC2 实例。
我有一个每晚运行的脚本,它使用 Robo 拾取文件 (/ebsvol/dead-drop/sync) 并将其移动到 (/ebsvol/dead-drop/sync),而 Robo 又使用 Symfony 的 Filesystem rename() 方法(https://symfony.com/doc/current/components/filesystem.html#rename)。
const CANARY_PATH = '/ebsvol/dead-drop/sync';
const CANARY_WORKING_PATH = '/ebsvol/dead-drop/~sync';
...
$this->taskFilesystemStack()
->rename(self::CANARY_PATH, self::CANARY_WORKING_PATH)
->run();
脚本或这段代码出了点问题,但这并不是我来这里的真正原因。结果和清理就是我在这里的原因。:)
结果是创建了 ~sync “文件”,但它实际上是...到 /bin 的硬链接?这就是事情变得可疑的地方。我的ls -ial
样子是这样的:
3276803 -rw-rw-r-- 1 configbot configbot 125 Jul 4 00:30 '~sync'
所以它只是一个文本文件,所以让我们试试 cat...
$ cat ~sync
cat: /bin: Is a directory
嗯,好的。
$ cd ~sync
...将我的提示更改为 /bin,然后执行 ls,它肯定是 bin。顺便说一句,ls -ial
在我的根卷上显示 /bin 是 iNode 12。
这在我过去曾经发生过一次,我只是这样做了rm -rf ~sync
,它淹没了我的整个服务器,我不得不重建。所以我试图避免这种情况。
如何在不丢弃 /bin 的情况下摆脱这个奇怪的 ~sync 文件/文件夹/符号链接/硬链接?
一些附加信息:
/ebsvol
是一个单独的 EBS 卷,而不是/
(即单独的硬盘驱动器/分区!)- 我认为如果它以某种奇怪的方式成为硬链接,
rm ~sync
可能会起作用。但它不会显示相同的 iNode 编号吗? - 在尝试任何操作之前,我将拍摄两个卷的快照。:)
如果您打算使用 bash 之类的 shell 访问文件,那么命名以波浪号开头的文件是一个非常糟糕的主意。原因是它将波浪号解释为您想要访问用户的主目录。
因此,bash(和其他 shell)扩展
~
至当前用户的主目录,并扩展~sync
至名为 sync 的用户的主目录。事实证明,您的 Ubuntu 系统有一个名为的系统用户
sync
,其主目录为/bin
. 因此,当您尝试~sync
从 shell 访问时,它会将其扩展到用户的主目录,并且您开始收到奇怪的消息。当你运行rm -rf ~sync
效果时rm -rf /bin
,这几乎会破坏系统。如果你想访问文件本身,可以引用它,或者在它前面加上一些东西,比如它的路径:
您还应该重新编写代码,使其不会创建以波浪号开头的文件名。这将为您和未来的您节省很多麻烦。