问题描述
尝试将test_dir
目录移动到/dev/null
时,收到消息
mv: cannot overwrite non-directory ‘/dev/null’ with directory ‘test_dir/’
那为什么人们会说“不要运行命令sudo mv ~ /dev/null
,它将把您的主目录移动到一个孔中?”
但是/home
也是一个目录。
最佳答案
因为人们假设。我是until I tested it之一。很容易理解人们为什么会假设…看起来很危险…
…但是您实际上无法将其移动到/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
次佳答案
/dev/null
只是一个文件,它是”special character”文件,但仍然受到文件必须遵循的规则的约束。话虽如此,您永远无法运行此命令:
$ mv ~ /dev/null
由于您要将目录移动到文件,因此mv
命令不允许这样做,这在上下文上是没有意义的,mv
知道这一点。
例子
$ mkdir dir
$ touch afile
$ mv dir afile
mv: cannot overwrite non-directory ‘afile’ with directory ‘dir’
如果您尝试将常规文件复制到/dev/null
,则由于它是字符文件,因此也不能复制到/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`
相当于说”nothing”。打破这个假设可能导致随机数据(好吧,最后一个进程写入到“ /dev /null”的数据)插入整个系统的系统文件中,这可能会导致完全损坏且无法恢复的系统。
第三种答案
您可以将文件或其他输入流写入/dev/null
,但不能写入目录。如果尝试将目录移动到/dev/null
,则由于/dev/null
不是目录而是文件,因此将报告错误。
但是,由于要尝试使用/dev/null
,因此建议您首先了解移动文件以覆盖/dev/null
的后果以及如何从这种情况中恢复:
正如该问题的this answer中的@Rmano所建议的那样,为了尝试使用/dev/null
,我们宁愿创建它的副本然后进行实验。因此,让我们创建/tmp/null
并将其用于我们的实验目的:
sudo mknod -m 0666 /tmp/null c 1 3
从现在起,/tmp/null
是我们的/dev/null
,可用于所有用途:
让我们在名为ask_ubuntu
的目录中创建test_file
和test_dir
。
$ 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
现在,让我们看一下是否可以从/tmp/null
中恢复test_file
:
$ 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
会在启动时获取re-created,因此,当我们关闭计算机时,我们的文件会丢失。
-
-
但是,如果要恢复
echo "Stream this line to /dev/null" > /dev/null
之类的输入流,则无法恢复,因为/dev/null
是处理不需要的文件和输入流的特殊文件,并且如Wikipedia文章所述,它不向从其读取的进程提供任何数据。 。
参考:关于/dev/null
的维基百科文章
第四种答案
发送到/dev/null
的所有内容均被静默丢弃。如果输入:
echo "Hello World"
您会在屏幕上看到Hello World
。如果输入:
echo "Hello World" >/dev/null
屏幕上什么也没有。
但是对于move命令,命令mv
尝试用目录替换文件/dev /null,这是不可能的。因为在Linux中一切都是文件,所以/dev /null是文件。当然是一个特殊的文件(一个设备文件),一个特殊的文件允许访问硬件(例如磁盘,分区,声卡,串行端口等)。在/dev /null的情况下,它没有链接到任何硬件,因此发送给它的数据被静默丢弃。这就是为什么”they”称其为黑洞的原因。