Bash Unix shell按大小分组文件扩展名
我想按当前和所有子文件夹中的扩展名对文件大小进行分组和排序Bash Unix shell按大小分组文件扩展名,bash,shell,unix,find,Bash,Shell,Unix,Find,我想按当前和所有子文件夹中的扩展名对文件大小进行分组和排序 for i in `find . -type f -name '*.*' | sed 's/.*\.//' | sort | uniq ` do echo $i done 获取获取当前和所有子文件夹中所有文件扩展名的代码 for i in `find . -type f -name '*.*' | sed 's/.*\.//' | sort | uniq ` do echo $i done 现在我需要将所有文件的大小按这
for i in `find . -type f -name '*.*' | sed 's/.*\.//' | sort | uniq `
do
echo $i
done
获取获取当前和所有子文件夹中所有文件扩展名的代码
for i in `find . -type f -name '*.*' | sed 's/.*\.//' | sort | uniq `
do
echo $i
done
现在我需要将所有文件的大小按这些扩展名求和并打印出来
你知道怎么做吗
示例输出:
sh (files sizes sum by sh extension)
pl (files sizes sum by pl extension)
c (files sizes sum by c extension)
我会使用循环,这样您每次都可以提供不同的扩展名,然后
只查找具有该扩展名的文件:
for extension in c php pl ...
do
find . -type f -name "*.$extension" -print0 | du --files0-from=- -hc
done
总数是根据表中的答案计算的
如果您想要问题中提到的非常具体的输出,您可以存储最后一行,然后将其与扩展名一起打印:
for extension in c php pl ...
do
sum=$(find . -type f -name "*.$extension" -print0 | du --files0-from=- -hc | tail -1)
echo "$extension ($sum)"
done
我会使用循环,这样您每次都可以提供不同的扩展名,然后只查找具有该扩展名的文件:
for extension in c php pl ...
do
find . -type f -name "*.$extension" -print0 | du --files0-from=- -hc
done
总数是根据表中的答案计算的
如果您想要问题中提到的非常具体的输出,您可以存储最后一行,然后将其与扩展名一起打印:
for extension in c php pl ...
do
sum=$(find . -type f -name "*.$extension" -print0 | du --files0-from=- -hc | tail -1)
echo "$extension ($sum)"
done
如果您不想预先命名文件扩展名,stat(1)程序有一个格式选项(-c),如果您在包含它的系统上,它可以使这样的任务变得更容易,而xargs(1)通常有助于提高性能
#!/bin/sh
find . -type f -name '*.*' -print0 |
xargs -0 stat -c '%s %n' |
sed 's/ .*\./ /' |
awk '
{
sums[$2] += $1
}
END {
for (key in sums) {
printf "%s %d\n", key, sums[key]
}
}'
如果您不想预先命名文件扩展名,stat(1)程序有一个格式选项(-c),如果您在包含它的系统上,它可以使这样的任务变得更容易,而xargs(1)通常有助于提高性能
#!/bin/sh
find . -type f -name '*.*' -print0 |
xargs -0 stat -c '%s %n' |
sed 's/ .*\./ /' |
awk '
{
sums[$2] += $1
}
END {
for (key in sums) {
printf "%s %d\n", key, sums[key]
}
}'
提到性能,然后提到管道find
,xargs
,sed
和awk
看起来有点矛盾;性能的许多方面。在shell脚本的上下文中,我通常希望限制调用的进程数量,而xargs是一种很好的方法。因此,我的尝试是获得您命名的四个命令的所有文件扩展名的完整枚举,以及xargs调用stat的次数(取决于系统-每个调用可能在当前系统上处理大约128k的路径名,因此这是一个好处)。但hc总结文件大小信息的速度似乎比awk快…提到性能,然后是管道find
,xargs
,sed
和awk
看起来有点矛盾;性能的许多方面。在shell脚本的上下文中,我通常希望限制调用的进程数量,而xargs是一种很好的方法。因此,我的尝试是获得您命名的四个命令的所有文件扩展名的完整枚举,以及xargs调用stat的次数(取决于系统-每个调用可能在当前系统上处理大约128k的路径名,因此这是一个好处)。但hc汇总文件大小信息的速度似乎比awk快得多。。。