14 ls find disk-usage
我在与其他同事共享的集群上工作。硬盘是有限的(并且在某些情况下已经满了),所以我偶尔会清理我的部分。我想快速完成此操作,因此直到现在,我通过列出超过 3 个月的大于 100 MB 的文件列表来执行此操作,然后看看我是否仍然需要它们。
但现在我想可能有一个文件夹包含超过 1000 个我错过的小文件,所以我想找到一种简单的方法来查看是否是这种情况。从我生成数据的方式来看,这将有助于获得每个扩展的总大小列表。在这个问题的上下文中,“扩展名”作为文件名中最后一个点后面的所有内容。
假设我有多个包含多个文件的文件夹:
folder1/file1.bmp 40 kiB
folder1/file2.jpg 20 kiB
folder2/file3.bmp 30 kiB
folder2/file4.jpg 8 kiB
Run Code Online (Sandbox Code Playgroud)
是否可以列出每个文件扩展名的总文件大小,如下所示:
bmp 70 kiB
jpg 28 kiB
Run Code Online (Sandbox Code Playgroud)
我不关心没有扩展名的文件,因此它们可以被忽略或归为一类。
我已经浏览了ls
,du
和 的手册页find
,但我不知道什么是适合这项工作的工具......
Sté*_*las 18
在 GNU 系统上:
find . -name '?*.*' -type f -printf '%b.%f\0' |
awk -F . -v RS='\0' '
{s[$NF] += $1; n[$NF]++}
END {for (e in s) printf "%15d %4d %s\n", s[e]*512, n[e], e}' |
sort -n
Run Code Online (Sandbox Code Playgroud)
或以相同的perl
,避免了-printf
GNU的扩展find
(仍在使用GNU扩展,-print0
但这个人是更广泛的支持时下):
find . -name '?*.*' -type f -print0 |
perl -0ne '
if (@s = stat$_){
($ext = $_) =~ s/.*\.//s;
$s{$ext} += $s[12];
$n{$ext}++;
}
END {
for (sort{$s{$a} <=> $s{$b}} keys %s) {
printf "%15d %4d %s\n", $s{$_}<<9, $n{$_}, $_;
}
}'
Run Code Online (Sandbox Code Playgroud)
它给出如下输出:
12288 1 pnm
16384 4 gif
204800 2 ico
1040384 17 jpg
2752512 83 png
Run Code Online (Sandbox Code Playgroud)
如果你想要KiB
, MiB
... 后缀,管道到numfmt --to=iec-i --suffix=B
.
%b*512
给出磁盘使用情况,但请注意,如果文件被多次硬链接,它们将被计算多次,因此您可能会看到与du
报告内容的差异。
不如斯蒂芬的解决方案那么好,但你可以尝试
find . -type f -name "*.png" -print0 | xargs -0r du -ch | tail -n1
Run Code Online (Sandbox Code Playgroud)
您必须为每种类型的文件运行此命令。
小智 5
这是另一个解决方案:
find . -type f | egrep -o "\.[a-zA-Z0-9]+$" | sort -u | xargs -I '%' find . -type f -name "*%" -exec du -ch {} + -exec echo % \; | egrep "^\.[a-zA-Z0-9]+$|total$" | uniq | paste - -
Run Code Online (Sandbox Code Playgroud)
获得扩展的部分是:
find . -type f | egrep -o "\.[a-zA-Z0-9]+$" | sort -u
Run Code Online (Sandbox Code Playgroud)
接下来搜索带有扩展名的文件并将其打印在屏幕上:
xargs -I '%' find . -type f -name "*%" -exec du -ch {} + -exec echo % \;
Run Code Online (Sandbox Code Playgroud)
接下来我们要保留扩展名和总数:
egrep "^\.[a-zA-Z0-9]+$|total$" | uniq
Run Code Online (Sandbox Code Playgroud)
并保持在同一行:
paste - -
Run Code Online (Sandbox Code Playgroud)