[bash] как сравнить два текстовых файла

HEPB

Постоялец
Регистрация
24 Июн 2009
Сообщения
111
Реакции
8
Есть такой код:


PHP:
#!/bin/bash
 
filename=/var/s1.cfg
filename1=/var/s1.bak
filesize=$(stat -c%s "$filename")
filesize1=$(stat -c%s "$filename1")
 
 
if [ "$filesize" = "$filesize1" ];
then
exit 0
else
# тут всякие команды
 
 
cp /var/s1.cfg  /var/s1.bak
 
fi

То есть смысл в чем. Надо выполнить "всякие команды", если что-то изменилось в файле /var/s1.cfg с момента последнего выполнения данного скрипта.
Для этих целей придумано создавать bak-файл этого /var/s1.cfg и сравнивать на размер.
Это все хорошо, но возможны ситуации, что размер не изменился, но содержимое файла изменилось.
Можно было бы сравнивать даты создания файлов cfg и bak, однако команда cp создает файл с новой датой, а не датой создания файла - оригинала.
Выходов два: 1) сравнивать содержимое файлов, что думаю не очень рационально, размеры файлов могут быть большими (до 400-500 кБт); 2) во втором файле хранить не содержимое первого файла, а дату и время его создания и если оно отличается, то произвести действия и сохранить новое время и дату создания.


Возможно ли такое сделать на shell-скрипте. Помогите, пожалуйста с реализацией данного скрипта.
 
Код:
#!/bin/sh
 
if diff file1 file2 >/dev/null ; then
  echo OK
else
  cp /orig/file ~/file1
fi

еще посмотри в сторону cmp Для просмотра ссылки Войди или Зарегистрируйся
 
  • Нравится
Реакции: HEPB
появилась еще одна нужда. Сравнить кол-во строк в двух текстовых файлах. Если в однм файле кол-во строк меньше, чем в другом, то выполнить некоторые действия. Как узнать кол-во строк в текстовом файле?
 
wc -l считает строки в файле, когда посчитаешь, сравниваешь, и с помошью if задаешь действие

число_1 -eq число_2 - истина, если числа равны.
число_1 -ne число_2 - истина, если числа не равны.
число_1 -gt число_2 - истина, если первое число больше второго.
число_1 -ge число_2 - истина, если первое число больше или равно второму.
число_1 -lt число_2 - истина, если первое число меньше второго.
число_1 -le число_2 - истина, если первое число меньше или равно второму.
 
  • Нравится
Реакции: HEPB
да какой там синтакис :)

#!/bin/bash
a= wc -l < /etc/var/file.txt
echo $a
 
  • Нравится
Реакции: HEPB
еще вопрос возник. можно ли как то проверять, запущен ли такой-то процесс и если нет, то запустить его?
 
Вариант uNknownMark работает, только у меня один из процессов вроде как зависает время от времени. Понять не могу почему, видимо что-то с железом связано, на втором серевере аналогичном таких проблем не возникало. В результате проверка
if ps ax | grep your_needed_name | grep -vq grep
не срабатывает.
можно ли в условии еще прописать, что процесс не завис?
 
Код:
if [ `ps -C your_proc_name | wc -l` != 1 ]; then echo "OK"; fi;

Это проверит, запущен ли процесс. На зависание хз как в общем случае проверять, это зависит от процесса.
 
Назад
Сверху