du -sh --exclude={} 命令中的 cat/echo 命令导致长时间运行并且无法按预期运行

du -sh --exclude={} 命令中的 cat/echo 命令导致长时间运行并且无法按预期运行

我是这个页面的崇拜者,我希望我能在这里找到答案。

因此,我想检查特定文件系统中除少数目录之外的所有目录的磁盘使用情况(我将其存储在存储的文件中,根据某些要求动态创建)。

但我观察到,当我直接在排除命令中对值进行硬编码时,速度非常快,结果也很准确。但是当我在排除命令中传递命令时。这花费了更多的时间并且产生了错误的结果。我不想总是硬编码,请建议

编码版本(a、b 是子目录)——给出了正确的结果

du -sh --exclude={a,b} filesystem/*

命令版本

假设我有一个文件(directory_list.txt),其中包含 a 和 b 目录名。

du -sh --exclude={`cat directory_list.txt`} /filesystem/*

我想到的另一件事是,由于排除并没有给我带来准确和及时的结果,我将直接选择我想要的目录

如下

ls filesystem/ | grep -v $(cat directory_list.txt) > selected.txt  --

排除目录并仅选择需要的目录

du -sh $(cat selected.txt)

但请建议更好的方法以及如何使我的命令在排除命令中工作谢谢穆罕默德

答案1

Linux 上的命令du(似乎就是您正在使用的命令)提供了一个--exclude-from选项:

du -h -s --exclude-from=directory_list.txt /filesystem/*

或者

du -h -s -X directory_list.txt /filesystem/*

这假设该文件directory_list.txt包含每行一个的 shell 通配模式(不是正则表达式),应将其排除。这些模式可能是路径名,或者只是文件或目录的名称,并且可能包括 shell 通配字符。


在使用 的命令中--exclude={`cat directory_list.txt`},您试图让 shell 使用 的内容进行大括号扩展directory_list.txt。当进行大括号扩展时这不起作用甚至考虑命令替换。

你什么可以du如果您没有,则已完成的操作--exclude-from是将要从文件中排除的内容读取到数组中,并在执行此操作时添加--exclude=到每个元素,然后在调用中使用该数组du

exclude=()
while IFS= read -r item; do
    exclude+=( --exclude="$item" )
done <directory_list.txt

du -h -s "${exclude[@]}" /filesystem/*

这假设,就像 一样--exclude-from,您的文件每行包含一个模式。

如果您使用的 shell 不支持数组,那么您可以减少输入的数量:

set --
while IFS= read -r item; do
    set -- "$@" --exclude="$item"
done <directory_list.txt

du -h -s "$@" /filesystem/*

这使用位置参数列表而不是命名数组。

这两个循环也会保留路径名中的空格,并且不允许 shell 错误地扩展文件名通配模式,这是命令的几个问题grep -v $(cat directory_list.txt)(另一个是您将文件中的大部分路径名传递给grep作为要搜索的文件而不是作为要排除的模式)。

答案2

这并不能准确回答您的问题,但有时人们会du -sh为了找到磁盘占用而抽搐。

如果是这种情况,您应该考虑使用 ncdu 工具。它基于诅咒并且速度很快,当您使用箭头键遍历树时,它将根据消耗的总磁盘空间对所有内容进行排序。

相关内容