Назад | Перейти на главную страницу

Как найти самые большие файлы на нескольких серверах и просуммировать их размер?

Я пытаюсь найти самые большие файлы в каталоге / export / home и сложить (суммировать) их размеры.

Сценарий:

#!/bin/bash
filename=hostnames
> export_home.log

while read -r -a line
do
    hostname=${line//\"}
    echo $hostname":" >> export_home.log
    ssh -n -t -t $hostname "sudo find /export/home -type f -mtime +180 -size +250000k -exec du -hsk {} \;" >> export_home.log
done < "$filename"

Пример вывода:

server-34:
 210M   /export/home/john/142933-02/failsafe_archive
 178M   /export/home/john/137137-09/failsafe_archive
server-35:
server-36:
 142M   /export/home/marc/bdb/db-5.2.36.tar
 446M   /export/home/marc/sunfreeware/git/git-1.7.6-sol10-x86-local
 1.4G   /export/home/marc/mysql/mysql-5.5.16-solaris10-x86_64.tar
 1.1G   /export/home/marc/mysql/mysql-5.5.16-solaris10-i386.tar
server-37:

Этот скрипт отлично справляется с тем, что должен, но как теперь получить общий размер ВСЕХ файлов, найденных на основе результатов в export_home?

Я планирую внести несколько изменений в этот сценарий, чтобы определить общий размер каталогов журналов и локальных резервных каталогов, чтобы лучше понять комбинированное использование диска на нескольких серверах. Я не уверен, как я смогу определить общее использование диска.

Когда я использую -k, Я не слышу суффиксов "M" и "G". Если вы получаете суффиксы, вам следует использовать предложение jeffatrackaid, чтобы размеры были масштабированы до той же величины.

Есть много способов суммировать значения. Вот один:

#!/bin/bash
filename=hostnames
# no need to clear the file, just move the output redirection to the end of the loop

# are you reading into an array to split the line (hostname would be in ${line[0]})?
while read -r -a line
do
    hostname=${line//\"}
    echo "$hostname:"
    ssh -n -t -t "$hostname" "sudo find /export/home -type f -mtime +180 -size +250000k -exec du -hsk {} \;"
done < "$filename" | tee export_home.log | awk '{t += $1} END {print "grand total:", t}'

Если ваша версия find поддерживает это, попробуйте использовать + вместо того \; - это быстрее.

    ssh -n -t -t "$hostname" "sudo find /export/home -type f -mtime +180 -size +250000k -exec du -hsk {} +"