Скрипт, который сравнивает 2 размера файла и выдает предупреждение

264
stefzeer

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

До сих пор я придумал это:

#!/bin/bash test1=/trans/home/user/test1 test2=/trans/home/user/test2 test1=$(stat -c%s "$test1") test2=$(stat -c%s "$test2")  if (( test2 > 110 * test1 )) then echo "WARNING: test2 has increased 10% or more in size" fi 

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

Любые идеи, как отредактировать это для работы, будут оценены.

С уважением.

2

3 ответа на вопрос

3
RalfFriedl

Тебе нужно

if (( test2 > 110 * test1 / 100)) 

размер плюс 10% равен 1,10 или 110/100, а не 110. Обратите внимание, что вы должны сначала умножить, а затем разделить, в противном случае значение 110/100, округленное до целого числа, составляет всего 1,00. С другой стороны, 110 * test1 может превышать целочисленный диапазон, хотя это маловероятно с размерами файлов и 64-битными целыми числами.

В этом случае умножение на 11, а затем деление на 10 уменьшит риск переполнения. `test1 / 10 + test1` может быть даже лучше. Kamil Maciorowski 5 лет назад 0
@KamilMaciorowski Это правда, но, как я уже упоминал, риск переполнения 64-битных файлов с размером файла невелик, и легко понятный код также имеет свое значение. RalfFriedl 5 лет назад 0
2
Alex

Ваша математика не верна. Ниже приведен скрипт, использующий bcпрецизионный калькулятор, который может выполнять операции с плавающей запятой, не беспокоясь о переполнении вbash

#!/bin/bash  test1=/trans/home/user/test1 test2=/trans/home/user/test2 test1sz=$(stat -c%s "$test1") test2sz=$(stat -c%s "$test2")  [ $(echo "scale=2; $ > $*1.1" | bc) -eq 1 ] && { echo "WARNING: $ has increased 10% or more in size" } 
0
stefzeer

Удалось сделать это так:

#!/bin/bash test1=/trans/home/stefan01/test1 test2=/trans/home/stefan01/test2 test1=$(stat -c%s "$test1") test2=$(stat -c%s "$test2") PERC=$(bc <<< "scale=2; ($test2 - $test1)/$test1 * 100") echo "$PERC %" 

Это показывает точную разницу в размере файлов в процентах. Теперь я могу просто, если / затем, чтобы он также отображал предупреждающее сообщение, если результат составляет 10% или более.

Спасибо за вашу помощь, ребята.

Похожие вопросы