Zasadniczo musisz porównać dwa pliki, warunkowo ignorując końcowy bajt. Nie ma opcji „diff”, aby to zrobić - ale istnieje wiele sposobów, aby to zrobić (np. Przychodzi na myśl również hex diff).
Aby użyć „diff”, musisz po prostu zmodyfikować pliki, które nie mają nowej linii na końcu pliku, a następnie porównać. Możesz utworzyć katalog tymczasowy ze zmodyfikowanymi plikami lub przy odrobinie skryptu można to zrobić w pamięci. (Wybór preferowanego zależy od preferencji, rozmiaru pliku, liczby plików ...)
Na przykład: zmodyfikuje zawartość pliku (użyj sed -i
do modyfikacji w miejscu, to po prostu drukuje na standardowe wyjście), aby dodać nowy wiersz, jeśli go brakuje (lub pozostaw plik bez zmian, jeśli już jest nowy wiersz):
sed -e '$a\' file1.txt
I tylko w celu przejrzenia składni „diff” (zwracanie true oznacza, że są takie same, false oznacza różne):
$ diff a/file1.txt b/file1.txt \
&& echo '** are same' || echo '** are different'
2c2
< eof
---
> eof
\ No newline at end of file
** are different
Sprawdź, czy tylko białe znaki są różne:
$ diff --ignore-all-space a/file1.txt b/file1.txt \
&& echo '** are same' || echo '** are different'
** are same
W bash możemy użyć „sed” do manipulowania zawartością pliku, który jest przekazywany do „diff” (oryginalne pliki pozostały niezmienione):
$ diff <(sed -e '$a\' a/file1.txt) <(sed -e '$a\' b/file1.txt) \
&& echo '** are same' || echo '** are different'
** are same
Teraz wystarczy naśladować diff -r
rekurencyjne porównywanie katalogów. W przypadku porównywania katalogów a
i b
, to dla wszystkich plików a
(na przykład a/dir1/dir2/file.txt
) nie czerpią ścieżkę do pliku w b
(na przykład b/dir1/dir2/file.txt
) i porównać:
$ for f in $( find a -type f )
> do
> diff <(sed -e '$a\' $f) <(sed -e '$a\' b/${f#*/})
> done
Nieco bardziej pełna wersja:
$ 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\'
dokładnie robi? thx