Ответ 1
это сделает это:
total=0
for file in $(ls *.txt)
do
space=$(ls -l $file | awk '{print $5}')
let total+=space
done
echo $total
У меня есть несколько файлов в нескольких папках:
/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
это сделает это:
total=0
for file in $(ls *.txt)
do
space=$(ls -l $file | awk '{print $5}')
let total+=space
done
echo $total
find folder1 folder2 -iname '*.txt' -print0 | du --files0-from - -c -s | tail -1
Это сообщит об использовании дискового пространства в байтах по расширению:
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
Простой:
$du -ch *.txt.
Если вы хотите, чтобы общее пространство было отображено, тогда:
$du -ch *.txt | tail -1
Вот способ сделать это, избегая плохая практика:
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}'
MacOS
du
и параметр -I
, чтобы исключить все остальные файлыLinux
-X, --exclude-from=FILE
exclude files that match any pattern in FILE
--exclude=PATTERN
exclude files that match PATTERN
Основываясь на ennuikiller's, это будет обрабатывать пробелы в именах. Мне нужно было сделать это и получить небольшой отчет:
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
Один вкладыш для тех, у кого есть инструменты 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
и т.д.
Найти GNU,
find /home/d -type f -name "*.txt" -printf "%s\n" | awk '{s+=$0}END{print "total: "s" bytes"}'
Мне нравится использовать find в комбинации с xargs:
find . -name "*.txt" -print0 |xargs -0 du -ch
Добавьте хвост, если вы хотите видеть только общую сумму
find . -name "*.txt" -print0 |xargs -0 du -ch | tail -n1
мое решение, чтобы получить общий размер всех текстовых файлов в заданном пути и подкаталогах (используя perl oneliner)
find /path -iname '*.txt' | perl -lane '$sum += -s $_; END {print $sum}'