linux shell 获取所有文件大小,关于linux:计算shell中文件的大小

我正试图用shell计算与文件名模式匹配的所有文件(在目录树中)的总大小(以字节为单位)。这就是我目前为止所拥有的:

find -name *.undo -exec stat -c%s {} \; | awk '{total += $1} END {print total}'

有更简单的方法吗?我觉得应该有一个简单的du或find开关来为我做这个,但我找不到。

要明确一点,我希望在目录树下的任何位置汇总与模式匹配的文件,这意味着

du -bs *.undo

无法工作,因为它只与当前目录中的文件匹配。

无论如何,du(或不工作ls)以上几成千上万的文件("参数列表太长"的错误)。

尝试:

find . -name"*.undo" -ls | awk '{total += $7} END {print total}'

在我的系统中,文件的大小是find -ls输出中的第七个字段。如果您的find … -ls输出不同,请进行调整。

在这个版本中,使用现有的目录信息(文件大小)和find的内置ls功能应该是有效的,避免了过程创建或文件I/O。

这应该是可行的,但是要查找的-ls选项和awk对于这个任务来说是多余的。

不,一点也不过分杀人。

我会在find命令中添加"-type f",以防止在目录与"*.undo"glob匹配时出现错误总计。

注意,如果需要多个模式来匹配,则必须对整个表达式使用转义括号来匹配,否则-ls只适用于最后一个模式。例如,如果要匹配所有的jpeg和png文件(信任文件名),可以使用find . \( -iname"*.jpg" -o -iname"*.jpeg" -o -iname"*.png" \) -ls | awk '{total += $7} END {print total}'(-iname用于不区分大小写的搜索;另外,请注意表达式和转义括号之间的空格)。

这真的是在Linux中执行dir *.undo /s的最简单方法吗?

使用zsh,您可以使用扩展的globbing执行以下操作:

DU-C**/*.撤消

还有鱼和肉4.0!

和du -ch **/*.undo以获得人类可读的文件大小…

find -name *.undo -print0 | du -hc --files0-from=-

这将列出所有文件。有没有办法只显示总数?不管怎样,我认为这是一个"正确答案"的候选人。

我喜欢这个,因为它显示了"人类可读"的大小。@泰勒·科利尔只展示全部使用的尾巴:find -type f -name '*.undo' -print0 | du -hc --files0-from=- | tail -n 1。

这是我在Linux上做这件事所见过的最好的答案…它的执行速度比我看到的任何其他答案都快1000倍,因为文件上的du执行速度非常快,而且它以人类可读的方式提供输出。

如果文件太多,-files0-from就不起作用,因为文件名太长,我出错了。

du -c *pattern*

这将在输出的最后一行打印合计。

用尾巴修剪除最后一行以外的所有东西。+ 1。= ]

这只会在当前目录中找到与模式匹配的文件,对吗?

你可以使用像*/*.undo这样的模式…尽管这样只会找到具有撤消扩展名的文件,而该扩展名只有一个文件夹深…在当前目录中也找不到。

迄今为止最简单的解决方案!

du -ch *pattern*获取人类可读格式的结果(如99k 42m 67.8g)

我也一直在关注这个问题(仅仅一年之后…)-只是找到了这个页面。

我发现(对我)有用的东西是:

find /mnt/iso -name *.avi -printf"%s

" | paste -sd+ - | bc

这将返回下面所有子文件夹中所有.avi文件的总大小/mnt/iso

我必须将粘贴命令归功于Radoulov-参见本页:shell命令对整数求和,每行一个?

只需添加—以防文件夹与搜索词匹配—在find命令中使用-type f也是一个好主意。

find -name '*.undo' -exec wc -c {} + | tail -n 1

如果没有太多的文件(其中"太多"将是一个非常大的数字,可能是以千为单位),那么应该给出文件中实际的字节总数。或者,如果你只想知道电话号码,

find -name '*.undo' -exec wc -c {} + | tail -n 1 | cut -d' ' -f 1

您应该引用".undo"、".undo"、".undo"或类似的语句;否则,如果当前目录中存在.undo文件,则会得到错误的结果。

python是大多数Linux发行版的一部分。

import os

import fnmatch

size= 0

for path, dirs, files in os.walk( '.' ):

for f in files:

if fnmatch.fnmatch(f,'*.py'):

fileSize= os.path.getsize( os.path.join(path,f) )

print f, fileSize

size += fileSize

print size

很长,但非常清晰,可扩展性很强。

find -name '*.undo' -print0 | du -hc --files0-from=- | tail -n 1

从格德姆布和斯特拉格的贡献中总结出来。使用du -cb应该显示字节。

我使用这样的du命令只获取数字:

du file_list | awk '{s+=$1} END {print s}'

我认为带有xargs的版本可以被修改(简化)LS-1*.Undo xargs wc

du-c awk'./line=$0 end打印$1

Perl一个班轮:

find . -name"*.undo" -ls | perl -lane '$t += $F[6]; END{print $t}'

@F自动拆分数组从索引$F[0]开始,awk字段从$1开始,因此使用$F[6]代替awk的$7。

或者,您可以这样做:

dir=$1

for file in $dir/* ; do

length_file=`stat -c %s $file`

echo"File $file has length $length_file"

length_total=`expr $length_total + $length_file`

done

echo"Total length: $length_total ."

其中stat显示文件或文件系统状态。参数-c表示使用指定的格式而不是默认格式,格式序列$s允许显示字节的总大小。

expr

只计算表达式。

这个简单的怎么样。

find ./ -name *.undo | xargs wc

检查du(磁盘使用)命令。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值