尝试将test_dir
目录移动到时/dev/null
,我收到消息
mv: cannot overwrite non-directory ‘/dev/null’ with directory ‘test_dir/’
那么为什么人们会说“不运行命令sudo mv ~ /dev/null
,它将把您的主目录移到一个孔中?”
而且/home
也是目录。
尝试将test_dir
目录移动到时/dev/null
,我收到消息
mv: cannot overwrite non-directory ‘/dev/null’ with directory ‘test_dir/’
那么为什么人们会说“不运行命令sudo mv ~ /dev/null
,它将把您的主目录移到一个孔中?”
而且/home
也是目录。
Answers:
因为人们假设。在测试之前,我就是其中之一。很容易理解人们为什么会假设... 看起来很危险...
...但是您实际上无法将内容移至/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
不会导致该数据移入无内容。这将导致被好吗移动的数据,但/dev/null
将被覆盖,所以你可以将它回来了:)另见askubuntu.com/questions/435887/...
sudo mv file /dev/null
它将成功,并且很容易导致完全无法使用的系统。请参阅我对@MalteSkoruppa的评论中链接的问题的评论。这是“ sudo
只有在三次检查就知道自己在做什么的
sudo mknod -m 0666 /tmp/mynull c 1 3
---,然后再玩;-)
/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”的数据)会插入整个系统的系统文件中,这可能会导致系统彻底崩溃且无法恢复。
您可以将文件或其他输入流写入目录,/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
是一个用于处理不需要的文件和输入流的特殊文件,并且正如Wikipedia文章所提到的那样,它不向读取它的进程提供任何数据。
sudo mv test_file /dev/null
替换 /dev/null
为test_file
。因此,在那之后,这/dev/null
只是一个普通文件,您可以从其中读取任何写入该文件的内容。不
发送到的所有内容都将/dev/null
被静默丢弃。如果输入:
echo "Hello World"
您进入Hello World
屏幕。如果输入:
echo "Hello World" >/dev/null
屏幕上什么也没有。
但是对于move命令,该命令mv
尝试用目录替换文件/ dev / null,这是不可能的。因为在Linux中一切都是文件,所以/ dev / null是文件。当然是一个特殊的文件(一个设备文件),一个特殊的文件允许访问硬件(例如磁盘,分区,声卡,串行端口等)。在/ dev / null的情况下,它没有链接到任何硬件,因此发送给它的数据被静默丢弃。这就是为什么“他们”可能将其称为黑洞的原因。