2

Я полный новичок в написании сценариев, но мне нужен сценарий, который сравнивает размеры двух файлов и выдает предупреждение, если один из этих файлов на 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

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

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

С уважением.

3 ответа3

3

Тебе нужно

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

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

2

Ваша математика не верна. Ниже приведен скрипт, использующий калькулятор точности 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; ${test2sz} > ${test1sz}*1.1" | bc) -eq 1 ] && {
  echo "WARNING: ${test2} has increased 10% or more in size"
}
0

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

#!/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% или более.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .