我的文件系统上有一个“不是文件夹”也不是“文件”。这是一个运行 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 编号吗? - 在尝试任何操作之前,我将对两个卷进行快照。:)
答案1
如果您打算使用 bash 之类的 shell 访问文件,则以波浪符号开头命名文件是一个非常糟糕的主意。原因是它将波浪符号解释为您想要访问用户的主目录。
因此,bash(和其他 shell)扩展~
到当前用户的主目录,并扩展~sync
到名为 sync 的用户的主目录。
事实证明,您的 Ubuntu 系统有一个名为 的系统用户,sync
其主目录为/bin
。因此,当您尝试~sync
从 shell 访问时,它会将其扩展为用户的主目录,然后您开始收到奇怪的消息。当您运行时,rm -rf ~sync
效果是rm -rf /bin
,这几乎会破坏系统。
如果要访问文件本身,请引用它,或在其前面加上一些前缀,例如其路径:
$ cat ./~sync
您还应该重新编写代码,使其不创建以波浪符号开头的文件名。这将为您和将来的您省去很多麻烦。