在一个分区中我有几个文件和文件夹,我可以du
像这样列出所有这些文件的大小:
du -h
但是我如何列出超出特定磁盘空间大小(例如 5MB)的所有文件?
答案1
find /home/stephenm/ -maxdepth 1 -size +20k -exec du -h {} \;
这应该会列出 /home/stephenm 中超过 20k 的所有内容
要递归到子目录,请删除该-maxdepth 1
选项。
答案2
注意:du
不会打印文件的大小,而是给您提供文件空间使用情况的估计值。
您可以创建一个 10 MB 的文件,其占用的内存要少得多:
dd if=/dev/zero of=file seek=10M count=1 bs=1
stat -c %s file
ls -lh file
du -h file
cat file | wc
一个例子是压缩文件,它占用的磁盘空间小于其大小,就像上面的例子一样稀疏文件。
在上面的例子中,即使小于 5Mfind . -type f -size +5M
也会输出。file
du
如果您知道文件名中没有换行符,则可以find
使用以下命令过滤输出:
find . -type f -size +5M | while IFS= read -r file; do
du=$(du -k "$file")
size="${du%%$(printf "\t")*}"
if test $size -gt $((5 * 1024)); then
echo "$file"
fi
done
echo
如果您的文件名中可以有换行符,则可以使用此 GNU 扩展,但在循环中使用其他内容:
find . -type f -size +5M -print0 | while IFS= read -r -d '' file; do
du=$(du -k "$file")
size="${du%%$(printf "\t")*}"
if test $size -gt $((5 * 1024)); then
echo "$file"
fi
done
答案3
以下是 bash 中的一个直接解决方案,它可以分析文件和文件夹的大小:
#!/bin/bash
folder="$1"
limit="$2"
IFS=$'\n'
for item in `find "$folder"`; do
size=$(du -s "$item" | cut -f1)
if [ $size -gt $limit ]; then
echo $item
fi
done
第一个参数是检查的目标文件夹,
第二个参数是千字节的限制,其中 1K=1024 字节。