В основному вам потрібно порівнювати два файли, умовно ігноруючи байт із заднім числом. Для цього не існує варіанту "diff" - але існує ряд способів, як це можна зробити (наприклад, на думку також приходить шестигранна різниця.)
Щоб використовувати "diff", вам в основному потрібно змінити файли, у яких відсутній новий рядок в кінці файлу, а потім порівняти. Ви можете створити тимчасовий каталог із зміненими файлами, або з невеликим сценарієм зробити це в пам'яті. (Що стосується переваги, залежить від уподобань, розміру файлу, кількості файлів ...)
Наприклад, нижче буде змінено вміст файлу (використовується sed -i
для зміни на місці, це просто друкується до stdout), щоб додати новий рядок, якщо його немає (або залишити файл незмінним, якщо вже є новий рядок):
sed -e '$a\' file1.txt
І просто переглянути синтаксис 'diff' (повернення справжнього означає, що вони однакові, помилкові - це різні):
$ diff a/file1.txt b/file1.txt \
&& echo '** are same' || echo '** are different'
2c2
< eof
---
> eof
\ No newline at end of file
** are different
Перевірте, чи відрізняється лише пробіл:
$ diff --ignore-all-space a/file1.txt b/file1.txt \
&& echo '** are same' || echo '** are different'
** are same
В bash, ми можемо використовувати "sed" для маніпулювання вмістом файлу, коли він передається до "diff" (оригінальні файли залишаються незмінними):
$ diff <(sed -e '$a\' a/file1.txt) <(sed -e '$a\' b/file1.txt) \
&& echo '** are same' || echo '** are different'
** are same
Тепер все, що вам потрібно зробити, - це емуляція diff -r
рекурсивного порівняння каталогів. Якщо порівнювати каталоги a
та b
, то для всіх файлів у a
(наприклад, a/dir1/dir2/file.txt
) вивести шлях до файлу до b
(наприклад, b/dir1/dir2/file.txt
) та порівняти:
$ for f in $( find a -type f )
> do
> diff <(sed -e '$a\' $f) <(sed -e '$a\' b/${f#*/})
> done
Трохи більш деталізована версія:
$ for f in $( find a -type f )
> do
> f1=$f
> f2=b/${f#*/}
> echo "compare: $f1 $f2"
> diff <(sed -e '$a\' $f1) <(sed -e '$a\' $f2) \
> && echo '** are same' || echo '** are different'
> done && echo '** all are same' || echo '** all are different'
compare: a/file1.txt b/file1.txt
** are same
compare: a/file2.txt b/file2.txt
** are same
** all are same
sed -e '$a\'
саме робить? thx