当尝试将test_dir
目录移动到时/dev/null
,我收到消息
mv: cannot overwrite non-directory ‘/dev/null’ with directory ‘test_dir/’
那么为什么人们会说“不要运行该命令sudo mv ~ /dev/null
,它会将你的主目录移动到一个洞里?”
但/home
也是一个目录。
答案1
因为人们会假设。我就是其中之一直到我测试了它。很容易理解为什么人们认为……看起来危险的...
... 但您实际上无法将内容移动到/dev/null
— 这是一个特殊的文件,它只是吸收重定向(并将它们发送到虚无中)。如果您尝试将目录移动到它,文件系统将在您面前爆炸式增长,如果您尝试将文件移动到它,您可能最终会替换它。
第一个链接将处理目录,但这里有一个单独的测试,仅用于用文件覆盖它。正如 Rmano 在评论中指出的那样,如果没有成人监督,您可能不应该这样做。这其中存在风险。
$ echo "this is my file" > test
$ cat test
this is my file
$ sudo mv test /dev/null
$ cat /dev/null
this is my file
# Fix this!
$ sudo rm /dev/null
$ sudo mknod -m 0666 /dev/null c 1 3
答案2
/dev/null
只是一个文件,它是一个“特殊字符”文件,但它仍然受文件必须遵循的规则的约束。话虽如此,你永远不能运行这个命令:
$ mv ~ /dev/null
由于您正在将目录移动到文件,因此该mv
命令不允许这样做,这在上下文中没有任何意义,并且mv
知道这一点。
例子
$ mkdir dir
$ touch afile
$ mv dir afile
mv: cannot overwrite non-directory ‘afile’ with directory ‘dir’
/dev/null
如果您尝试将常规文件复制到该文件上,则无法复制到其中任何一个,因为它是一个字符文件。
$ cp ~/bzip2_1.0.6-4_amd64.deb /dev/null
$ ls -l |grep null
crw-rw-rw- 1 root root 1, 3 Mar 16 14:25 null
您可以对此文件执行的唯一操作是将mv
其复制到另一个文件或将其删除。
$ mv /path/to/afile /dev/null
此命令之后,/dev/null
是一个常规文件。此更改最危险的影响/dev/null
是绝不输出任何数据,因此许多 shell 脚本会假设
`... < /dev/null`
相当于说“什么都没有”。打破这一假设会导致随机数据(最后一个进程写入“/dev/null”的数据)插入到整个系统的系统文件中 --- 这可能会导致系统彻底崩溃且无法恢复。
答案3
您可以将文件或其他输入流写入目录,/dev/null
但不能写入目录。如果您尝试将目录移动到目录,/dev/null
则会报告错误,因为/dev/null
它不是目录而是文件。
但是,既然您想尝试/dev/null
,我们首先建议您了解移动文件进行覆盖的后果/dev/null
以及如何从这种情况中恢复:
根据建议@Rmano在这个答案对于这个问题,为了进行实验,/dev/null
我们应该创建它的副本,然后进行实验。所以,让我们创建/tmp/null
它并用于我们的实验目的:
sudo mknod -m 0666 /tmp/null c 1 3
从现在开始,我们的所有目的/tmp/null
都是:/dev/null
让我们在名为 的目录中创建一个test_file
和。test_dir
ask_ubuntu
$ mkdir ask_ubuntu
$ cd ask_ubuntu
$ touch test_file
$ mkdir test_dir
$ echo "Let us test if we can recover our test_file." > test_file
以下显示ask_ubuntu
目录的内容:
$ ls -la
total 12
drwxr-xr-x 3 aditya aditya 4096 Mar 18 17:10 .
drwxr-xr-x 4 aditya aditya 4096 Mar 18 17:10 ..
drwxr-xr-x 2 aditya aditya 4096 Mar 18 17:10 test_dir
-rw-r--r-- 1 aditya aditya 0 Mar 18 17:10 test_file
现在尝试将我们的移至test_file
并/tmp/null
查看的内容ask_ubuntu
:
$ sudo mv test_file /tmp/null # This succeeds
$ ls -la
total 12
drwxr-xr-x 3 aditya aditya 4096 Mar 18 17:12 .
drwxr-xr-x 4 aditya aditya 4096 Mar 18 17:10 ..
drwxr-xr-x 2 aditya aditya 4096 Mar 18 17:10 test_dir
命令成功,但test_file
不再可用。现在尝试移动test_dir
到/tmp/null
不成功的位置:
$ sudo mv test_dir/ /tmp/null
mv: cannot overwrite non-directory ‘/tmp/null’ with directory ‘test_dir/’
test_dir
仍然存在于里面ask_ubuntu
:
$ ls -la
total 12
drwxr-xr-x 3 aditya aditya 4096 Mar 18 17:12 .
drwxr-xr-x 4 aditya aditya 4096 Mar 18 17:10 ..
drwxr-xr-x 2 aditya aditya 4096 Mar 18 17:10 test_dir
现在,让我们看看我们是否可以test_file
从中恢复/tmp/null
:
$ cat /tmp/null
Let us test if we can recover our test_file.
所以,它仍然存在,并且/tmp/null
这个特殊文件已被覆盖,变得像任何其他普通文件一样。我们可以/tmp/null
像任何其他文件一样通过复制来恢复我们的文件:
$ cp /tmp/null our_test_file
$ cat our_test_file
Let us test if we can recover our test_file.
文件已恢复。
笔记:
如果您没有创建/tmp/null
并直接使用尝试这些命令/dev/null
;请确保通过运行恢复文件(如果需要)cp /dev/null our_test_file
;并/dev/null
通过尽快运行链接问题中给出的以下命令将其恢复到我们系统中:
$ sudo rm /dev/null
$ sudo mknod /dev/null c 1 3
$ sudo chmod 666 /dev/null
结论:
因此,不可能移动目录,
/dev/null
因此也不可能从那里恢复目录。至于文件,如果你直接将文件移动到
/dev/null
,你仍然可以恢复它,如上所示。但是,有两个例外:sudo mv test_file /dev/null
在你运行和的期间cp /dev/null our_test_file
,如果系统中的任何根脚本通过运行echo "Whatever text the root script wants to send to /dev/null" > /dev/null
(或其他类似命令)覆盖了它。那么我们就没有任何简单的方法来恢复我们的文件。如果在运行这两个命令之间重新启动系统,
/dev/null
则会在启动时重新创建,因此当我们关闭计算机时我们的文件就会丢失。
但是如果您想恢复像这样的输入流
echo "Stream this line to /dev/null" > /dev/null
,您就无法恢复它,因为它/dev/null
是一个用于处理不需要的文件和输入流的特殊文件,并且正如维基百科文章所提到的,它不会向从中读取的进程提供任何数据。
答案4
发送到的所有内容/dev/null
都会被默默丢弃。如果您输入:
echo "Hello World"
你就会Hello World
看到屏幕。如果你输入:
echo "Hello World" >/dev/null
屏幕上什么也看不到。
但在 move 命令的情况下,该命令mv
尝试用目录替换文件 /dev/null,这是不可能的。因为在 Linux 中一切都是文件,所以 /dev/null 是一个文件。当然是一个特殊的文件(设备文件),一个允许访问硬件(如磁盘、分区、声卡、串行端口等)的特殊文件。在 /dev/null 的情况下,它不与任何硬件相关联,因此发送给它的数据会被默默丢弃。这就是为什么“他们”可能称它为黑洞。