统计测量某些文件类型的磁盘空间

时间:2009-08-31 19:05:53

标签: linux bash unix diskspace

我有几个文件夹中的文件:

/home/d/folder1/a.txt
/home/d/folder1/b.txt
/home/d/folder1/c.mov
/home/d/folder2/a.txt
/home/d/folder2/d.mov
/home/d/folder2/folder3/f.txt

如何衡量/ home / d /中所有.txt文件占用的磁盘空间总量?

我知道 du会给我一个给定文件夹的总空间,而 ls -l会给我个别文件的总空间,但是如果我想要的话添加所有txt文件,只查看/ home / d /中所有.txt的所有.txt文件占用的空间,包括folder1和folder2及其子文件夹,如folder3 ?

13 个答案:

答案 0 :(得分:39)

find folder1 folder2 -iname '*.txt' -print0 | du --files0-from - -c -s | tail -1

答案 1 :(得分:19)

这将按扩展名报告磁盘空间使用情况:

find . -type f -printf "%f %s\n" |
  awk '{
      PARTSCOUNT=split( $1, FILEPARTS, "." );
      EXTENSION=PARTSCOUNT == 1 ? "NULL" : FILEPARTS[PARTSCOUNT];
      FILETYPE_MAP[EXTENSION]+=$2
    }
   END {
     for( FILETYPE in FILETYPE_MAP ) {
       print FILETYPE_MAP[FILETYPE], FILETYPE;
      }
   }' | sort -n

输出:

3250 png
30334451 mov
57725092729 m4a
69460813270 3gp
79456825676 mp3
131208301755 mp4

答案 2 :(得分:11)

简单:

$ du -ch * .txt。

如果您只是想要显示的总空间,那么:

$ du -ch * .txt |尾-1

答案 3 :(得分:5)

这是一种方法,避免使用bad practice

total=0
while read line
do
    size=($line)
    (( total+=size ))
done < <( find . -iname "*.txt" -exec du -b {} + )
echo $total

如果要排除当前目录,请将-mindepth 2find一起使用。

可能更符合POSIX标准的另一个版本:

find . -iname "*.txt" -exec du -b {} + | awk '{total += $1} END {print total}'

答案 4 :(得分:3)

这样做:

total=0
for file in $(ls *.txt)
do
space=$(ls -l $file | awk '{print $5}')
let total+=space
done
echo $total

答案 5 :(得分:3)

<强> MACOS

  • 使用工具du和参数-I排除所有其他文件

<强> 的Linux

-X, --exclude-from=FILE
              exclude files that match any pattern in FILE

--exclude=PATTERN
              exclude files that match PATTERN

答案 6 :(得分:2)

GNU find,

find /home/d -type f -name "*.txt" -printf "%s\n" | awk '{s+=$0}END{print "total: "s" bytes"}'

答案 7 :(得分:2)

在ennuikiller的基础上,这将处理名称中的空格。我需要这样做并得到一些报告:

find -type f -name“* .wav”| grep导出| ./calc_space

#!/bin/bash
# calc_space
echo SPACE USED IN MEGABYTES
echo
total=0
while read FILE
do
    du -m "$FILE"
    space=$(du -m "$FILE"| awk '{print $1}')
    let total+=space
done
echo $total

答案 8 :(得分:2)

对于那些在bash上使用GNU工具的人来说:

for i in $(find . -type f | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u); do echo "$i"": ""$(du -hac **/*."$i" | tail -n1 | awk '{print $1;}')"; done | sort -h -k 2 -r

您必须启用extglob:

shopt -s extglob

如果您想要点文件,则必须运行

shopt -s dotglob

示例输出:

d: 3.0G
swp: 1.3G
mp4: 626M
txt: 263M
pdf: 238M
ogv: 115M
i: 76M
pkl: 65M
pptx: 56M
mat: 50M
png: 29M
eps: 25M

答案 9 :(得分:0)

我喜欢将find与xargs结合使用:

find . -name "*.txt" -print0 |xargs -0 du -ch

如果您只想查看总计

,请添加尾部
find . -name "*.txt" -print0 |xargs -0 du -ch | tail -n1

答案 10 :(得分:0)

我的解决方案,以获取给定路径和子目录中所有文本文件的总大小(使用perl oneliner)

find /path -iname '*.txt' | perl -lane '$sum += -s $_; END {print $sum}'

答案 11 :(得分:0)

对于希望在命令行上使用macOS进行操作的任何人,您都需要基于-print0参数而不是printf的变体。上面的一些答案可以解决这个问题,但这可以通过扩展来全面实现:

    find . -type f -print0 | xargs -0 stat -f "%N %i" |
  awk '{
      PARTSCOUNT=split( $1, FILEPARTS, "." );
      EXTENSION=PARTSCOUNT == 1 ? "NULL" : FILEPARTS[PARTSCOUNT];
      FILETYPE_MAP[EXTENSION]+=$2
    }
   END {
     for( FILETYPE in FILETYPE_MAP ) {
       print FILETYPE_MAP[FILETYPE], FILETYPE;
      }
   }' | sort -n

答案 12 :(得分:0)

接受的答案有几个潜在的问题:

  1. 它不属于子目录(不依赖于globstar之类的非标准shell功能)
  2. 通常,如下面的丹尼斯·威廉姆森(Dennis Williamson)所指出的,您应避免使用parsing the output of ls
    • 即,如果用户或组(第3和第4列)中有空格,则第5列将不是文件大小
  3. 如果您有一百万个这样的文件,它将产生两个百万个子外壳,并且会很简单

proposed by ghostdog74一样,您可以对-printf使用特定于GNU的find选项,以获得更可靠的解决方案,避免所有多余的管道,子shell,Perl和奇怪的{{ 1}}选项:

du

是的,是的,使用# the '%s' format string means "the file's size" find . -name "*.txt" -printf "%s\n" \ | awk '{sum += $1} END{print sum " bytes"}' paste的解决方案也是可行的,但没有任何更直接的方法。

在macOS上,您需要使用Homebrew或MacPorts安装bc,然后调用findutils。 (我在这个问题上请参见“ linux”标签,但它也被标签为“ unix”。)

没有GNU gfind,您仍然可以退回到使用find

du

…但是,您必须注意以下事实:由于历史原因,find . -name "*.txt" -exec du -k + \ | awk '{kbytes+=$1} END{print kbytes " Kbytes"}' 的默认输出位于 512字节块中(请参见“ RATIONALE”部分{{3} }),而某些版本的du(尤其是macOS)甚至没有具有以字节为单位打印大小的选项。

这里还有许多其他好的解决方案(尤其是参见here),但是大多数解决方案都具有不必要的复杂性或过于依赖纯GNU功能的缺点-也许在您的环境中,可以!