Измерение дискового пространства определенных типов файлов в совокупности - PullRequest
20 голосов
/ 31 августа 2009

У меня есть несколько файлов в нескольких папках:

/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

Как измерить общий объем дискового пространства, занимаемого всеми файлами .txt в / home / d /?

Я знаю, du даст мне общее пространство данной папки , а ls -l даст мне общее пространство отдельных файлов , но что, если я захочу добавить скопируйте все txt-файлы и просто посмотрите на пространство, занимаемое всеми .txt-файлами в одном гигантском общем для всех .txt в / home / d /, включая folder1 и folder2 и их подпапки, такие как folder3?

Ответы [ 12 ]

39 голосов
/ 31 августа 2009

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

19 голосов
/ 08 февраля 2013

Это сообщит об использовании дискового пространства в байтах по расширению:

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
11 голосов
/ 04 октября 2013

Simple:

$ du -ch * .txt.

Если вы просто хотите, чтобы отображалось общее пространство, то:

$ du -ch * .txt | хвост -1

5 голосов
/ 01 сентября 2009

Вот способ сделать это, избегая плохой практики :

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

Если вы хотите исключить текущий каталог, используйте -mindepth 2 с find.

Другая версия, которая может быть более POSIX-совместимой:

find . -iname "*.txt" -exec du -b {} + | awk '{total += $1} END {print total}'
4 голосов
/ 01 сентября 2009

MacOS

  • используйте инструмент du и параметр -I, чтобы исключить все остальные файлы

Linux

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

--exclude=PATTERN
              exclude files that match PATTERN
3 голосов
/ 31 августа 2009

это сделает это:

total=0
for file in $(ls *.txt)
do
space=$(ls -l $file | awk '{print $5}')
let total+=space
done
echo $total
2 голосов
/ 28 августа 2015

Один вкладыш для тех, кто использует инструменты GNU на bash:

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

и т.д.

2 голосов
/ 22 августа 2010

Опираясь на эннуикиллер, он будет обрабатывать пробелы в именах. Мне нужно было сделать это и получить небольшой отчет:

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
2 голосов
/ 01 сентября 2009

GNU найти,

find /home/d -type f -name "*.txt" -printf "%s\n" | awk '{s+=$0}END{print "total: "s" bytes"}'
0 голосов
/ 27 декабря 2018

Для тех, кто хочет сделать это с 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
...