我正试图用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(磁盘使用)命令。