2016-07-12 1 views
0

Невозможно использовать diff и не может использовать cmp.bash сравнить содержимое двух файлов и на основании результатов сделать два разных действия

Мы с успехом используем comm, но я не получаю правильные результаты при использовании с условным сценарием.

#!/bin/bash 
# http://stackoverflow.com/a/14500821/175063 

comm -23 <(sort /home/folder/old.txt) <(sort /home/folder/new.txt) 
if [ $? -eq 0 ];then 
    echo "There are no changes in the files" 
else 
    echo "New files were found. Return code was $?" 
fi 

Он всегда возвращается:

Там нет никаких изменений в файлах

как команда комм, работает успешно, но содержимое файлов различны.

Я очень ограничен относительно того, что можно добавить на этот сервер, поскольку это корпоративная коробка LINUX.

+1

'comm' всегда возвращает 0 даже при ошибке, например, файл не найден. Вам нужно проверить stdout, чтобы увидеть, есть ли 'comm'. – alvits

+0

Как выглядят файлы? Вы знаете, что '$?' - это статус выхода последнего процесса, а не количество строк? – dawg

+1

То же самое на '$?'. Кроме того, 'comm -23' возвращает строку в old.txt, которая не находится в файле new.txt. Строки в файле new.txt, которые не находятся в old.txt, игнорируются. Это то, что вы хотите? – John1024

ответ

2

Вы должны быть в состоянии использовать:

! comm -3 <(sort /home/folder/old.txt) <(sort /home/folder/new.txt) | grep -q '.*' 

Команда comm преуспеет (выход со статусом 0) находит ли она какие-либо различия или нет, но grep успешно только если он находит совпадение. -q предупреждает grep о печати совпадения, а рисунок '.*' соответствует ничего. Таким образом, grep -q '.?' преуспевает, если его ввод непусто. Но вам нужен успех, если был матч, поэтому я добавил ! в начале, чтобы инвертировать статус.

Я также сделал одно другое изменение: comm -23 будет печатать строки, которые находятся в первом файле (old.txt), а не во втором (new.txt), но он не будет печатать строки, которые находятся в второй, но не первый. comm -3 будет печатать все строки, уникальные для одного из файлов, поэтому он найдет строки, которые были удалены или, добавленные между двумя файлами.

BTW, проверка того, является ли $? нулем, не является необходимым; просто использовать команду непосредственно в качестве условия if:

if ! comm -3 <(sort /home/folder/old.txt) <(sort /home/folder/new.txt) | grep -q '.*'; then 
    echo "There are no changes in the files" 
else 
    echo "New files were found. Return code was $?" 
fi 
+0

Это решение, которое я искал! Благодаря!! – Leptonator

0

трубы выход comm к wc -l, чтобы увидеть, если есть какие-либо новые файлы найдены.

new_file_count=$(comm -13 <(sort /home/folder/old.txt) <(sort /home/folder/new.txt) | wc -l) 
if [ $new_file_count -eq 0];then 
    echo "There are no changes in the files" 
else 
    echo "New files were found. Count is $new_file_count" 
fi 

Я изменил команду comm использовать -13 поэтому он будет печатать новые файлы, так как это то, что ваше сообщение показывает, вы хотите.

+0

Не рассчитывать. Файлы обновляются от поставщика. Как и файл 101.dat, будет обновлен до 102.dat, и файл 101.dat будет удален. Мы хотим узнать, будет ли файл 102.dat в этом примере уведомляться. – Leptonator

+0

Здесь подсчитывается количество строк в 'new.txt', которые не находятся в' old.txt'. Таким образом, счет будет '1', потому что' 102.dat' находится в новом файле, но не в старом. – Barmar

+0

Удаленные строки не учитываются, они будут учитываться 'comm -23'. – Barmar

Смежные вопросы