我只是不小心这样做了,rm -r /var
但幸运的是,在造成更多损失之前设法 ^C 了它。有没有办法找出该位置上所有文件被删除的软件包,以便我可以重新安装它们?
% ls -l /var
total 20
drwxr-xr-x 2 root root 4096 Jan 14 08:26 backups
drwxr-xr-x 23 root root 4096 Jan 6 20:26 cache
drwxr-xr-x 70 root root 4096 Jan 14 09:26 lib
lrwxrwxrwx 1 root root 9 Oct 31 17:53 lock -> /run/lock
drwxrwsr-x 2 root mail 4096 Oct 17 02:59 mail
lrwxrwxrwx 1 root root 4 Oct 31 17:53 run -> /run
drwxr-xr-x 11 root root 4096 Jan 10 22:06 spool
答案1
首先给出更通用、更简单的答案:
假设 dpkg 状态区域完好无损,您可以使用以下命令确定是否有任何已安装的软件包缺少注册文件:
for p in $(dpkg-query -f '${Package} ' -W); do
dpkg -L $p | grep '^/' | while read file; do
[ -e "$file" ] || echo "$p is missing $file"
done
done
要将检查限制在下的文件/var
,您只需更改 grep 表达式:
for p in $(dpkg-query -f '${Package} ' -W); do
dpkg -L $p | grep '^/var/' | while read file; do
[ -e "$file" ] || echo "$p is missing $file"
done
done
但是,这对你来说可能用处不大。部分原因是 Debian/Ubuntu 中的大多数软件包不会直接将许多文件发送到/var
,还因为我提到的 dpkg 状态区域生活在 之下/var
,在 中/var/lib/dpkg
。如果从那里删除了任何内容,您的问题就会变得更加复杂。
根据 FHS ,其中的大部分数据/var
都是“可变数据”;“假脱机目录和文件、管理和日志数据以及临时文件”。即使您重新安装所有软件包,其中的大部分(如果不是大部分)也不会恢复。但同样,即使没有它,您的系统也可能仍然可以很好地运行。
中最重要的数据/var
是您自己的数据;这可能是数据库内容、邮件、crontab 等。其中大部分将位于/var/lib
、/var/mail
、/var/spool
和/var/local
和下/var/opt
。如果这类数据已被删除,那么您可能只需要希望有好的备份。通常不太重要的是 中的系统日志/var/log
。如果这些都消失了,显然您已经失去了诊断过去问题的能力,但一切应该仍然工作. 中其余最常见的目录/var
(/var/backups
、/var/cache
、/var/run
、;其中一些可能是指向 或其他地方的符号链接/var/lock
)您不必担心;那里的数据应该可以由拥有应用程序重新生成。/var/tmp
/run
最后,如果您在意外删除操作后尚未重新启动系统或系统守护程序,则某些看似已删除的文件可能仍隐藏在某个进程中,并保持打开状态。此lsof
工具可以帮助您找到这些文件,您可以通过从 复制这些文件来检索它们/proc/$pid/fd/$fdnumber
。
答案2
我会采用一种更简单的方法。
请记住,您有一个已安装软件包的镜像(实际上是一个缓存),位于
/var/cache
因此,如果您想恢复程序和配置,只需进入缓存并重新安装其中的内容。当然,这只有在您没有安装任何会严重破坏系统的东西并且没有删除 apt 包缓存的情况下才会起作用(您为什么要这样做!?)。
如果是这样的话,我会选择:
cd /var/cache/apt/archives/
sudo apt-get install *.deb
再次强调,只有当您的系统在删除内容之前运行正常时,您才应该这样做。无论如何,您将在该位置找到所有已安装的软件包,它们会像第一次安装时一样重新配置您的设置(因此,尽管下面有注释,但您仍将获得程序 + 配置)。