有什么可靠的方法可以检查哪些文件和目录最近占用了根分区的磁盘空间?

有什么可靠的方法可以检查哪些文件和目录最近占用了根分区的磁盘空间?

我已经尝试过sudo du -csh *(在根目录中)sudo find /usr/lib/ -type f -printf "%s\t%p\n" | sort -n | tail -10 sudo du -a / --exclude=/media --exclude=/home | sort -n -r | head -n 100和类似的命令。我正在寻找有关的东西最近的磁盘空间使用情况并且有效可靠地(即使在我的用例中)。

这些的问题是,因为“设备上没有剩余空间”,所以我无法运行它们 - 如果我释放一些磁盘空间(例如通过运行漂白位或删除大型不必要的包或删除 /tmp/ 中的一些文件)不久之后,该空间也会被占用。我已经移动了 /var/lib/docker其大小为数 GB,随后被释放 - 现在肯定有什么东西占用了这些 GB 的磁盘空间。

第二个问题是,当我在有一些可用磁盘空间时运行这些命令时,我目前无法轻松识别哪些文件和目录是新的且不必要的。最大的目录似乎是/usr/share。

不过sudo du -csh /usr/share/* | grep "G"只显示7GB,应该不会太大。我存储到另一个分区的早期输出sudo du -ah / --exclude=/media --exclude=/proc --exclude=/home | sort -n -r | head -n 100仅显示 1 MB 大小的文件(包括 /usr/share/ 中的文件)。


有没有一种好方法可以很好地快速输出最近添加的最大文件和目录的列表,甚至可能包括负责该文件和目录的进程?如果可能的话,如果能够指定另一个 /tmp/ 目录来运行命令,这也会很有用。我使用的是 Debian10/KDE。

一个简单而可靠的方法来列出最近占用磁盘空间的内容在这里会非常方便。

更新:我能够显示根目录中最近修改的文件,这些文件大于预安装的指定文件大小查找。我无法用它排除目录,也无法启动 veracrypt 来卸载分区,因为我只收到消息“veracrypt 已在运行”。但是,我仍然能够找到有问题的文件:

它是 /proc/pid/task/pid/fd ,它是 konsole 的一个打开实例,仅运行一个命令,其中中止该命令不会释放磁盘空间 - 我必须关闭 konsole 窗口及其所有选项卡,随后又拥有了几 GB 的可用磁盘空间。

答案1

您可以使用上述简单命令来获取最后修改的文件和目录mtime

# Get files/dirs modified during the last 15 days and then desc  sort with disk usage and print the first 10 lines
find / -mtime -15  | xargs -I {} du -sm {} | sort -rn | head -10
# Get files/dirs modified during the last 60 minutes and then desc sort with disk usage and print the first 10 lines
find / -mmin -60 | xargs -I {} du -sm {} | sort -rn | head -10
# Get files/dirs modified between 2020-12-18 and 2020-12-19 then desc sort with disk usage  and print the first 10 lines
find / -newermt 2020-12-18 ! -newermt 2020-12-19 | xargs -I {} du -sm {} | sort -rn | head -10

如果您的系统能够存储创建时间;那么你可以用它crtime来代替。

首先检查crtime已设置的任何文件:

## Output should be different than - sign
stat -c '%w' <file>

B然后您可以使用带有选项的相同 find 命令Birth Time

# Get files/dirs **created** between 2020-12-18 and 2020-12-19 then desc  sort with disk usage and print the first 10 lines
find / -newerBt 2020-12-18 ! -newerBt 2020-12-19 | xargs -I {} du -sm {} | sort -rn | head -10

如果您的文件系统可以处理Birth Time,但在 stat 命令中没有看到它,您可以通过以下方式直接检查保存文件的设备级别:

# Getting the inode number
ls -i <file>
# Then get crtime 
debugfs -R 'stat <inode_no>' <device>

有一个由 @PascalVKooten 编写的 python 包堆栈溢出线程称为crtime您可以用来获取创建时间,我不知道它是否是递归的(未测试),但它会给您如下输出:

1552938281  /home/pascal/crtime/.gitignore
1552938285  /home/pascal/crtime/README.md
1552938282  /home/pascal/crtime/crtime
1552938288  /home/pascal/crtime/deploy.py

然后,您可以按降序对时间戳进行排序,并将它们转换为日期时间(如果需要):

sudo crtime ./ | awk '{print$1}' | sort -rn |  xargs -I {} date -d @{}

Mon Mar 18 20:44:48 +01 2019
Mon Mar 18 20:44:45 +01 2019
Mon Mar 18 20:44:42 +01 2019
Mon Mar 18 20:44:41 +01 2019

最后,要获取编辑某些文件或目录的最后一个进程,您可以使用auditctl并设置自定义规则,然后使用ausearch.

您也可以执行inotify-tools相同的操作,但我认为如果您对整个根文件系统执行此操作,它会严重影响内存使用。

Lsof无法使用,因为它涉及当前打开的文件而不是最近的文件。

此外,如果您能够使用第三方工具,请考虑使用ncdu 启用扩展信息模式来按额外属性进行排序,这样mtime您就可以将输出导出到文件中。

相关内容