Fondamentalmente è necessario confrontare due file, ignorando in modo condizionale il byte finale. Non esiste un'opzione 'diff' per farlo - ma ci sono un certo numero di modi in cui potrebbe essere fatto (ad esempio, viene in mente anche hex diff.)
Per usare 'diff', sostanzialmente devi modificare i file che mancano alla nuova riga alla fine di un file, e poi confrontare. È possibile creare una directory temporanea con i file modificati o con un po 'di scripting potrebbe essere eseguita in memoria. (Quanto a quale è preferito dipende dalla preferenza, dimensione del file, numero di file ...)
Ad esempio, quanto segue modificherà il contenuto di un file (usare sed -i
per modificare sul posto, questo stampa solo su stdout) per aggiungere una nuova riga se manca (o lasciare invariato il file se esiste già una nuova riga):
sed -e '$a\' file1.txt
E solo per rivedere la sintassi 'diff' (restituire vero significa che sono uguali, falso significa diverso):
$ diff a/file1.txt b/file1.txt \
&& echo '** are same' || echo '** are different'
2c2
< eof
---
> eof
\ No newline at end of file
** are different
Verifica che solo gli spazi siano diversi:
$ diff --ignore-all-space a/file1.txt b/file1.txt \
&& echo '** are same' || echo '** are different'
** are same
In bash, possiamo usare 'sed' per manipolare il contenuto del file mentre viene passato a 'diff' (file originali lasciati invariati):
$ diff <(sed -e '$a\' a/file1.txt) <(sed -e '$a\' b/file1.txt) \
&& echo '** are same' || echo '** are different'
** are same
Ora tutto ciò che devi fare è emulare diff -r
per confrontare ricorsivamente le directory. Se si confrontano le directory a
e b
, quindi, per tutti i file in a
(ad es. a/dir1/dir2/file.txt
) Derivano il percorso del file in b
(ad es. b/dir1/dir2/file.txt
) E si confrontano:
$ for f in $( find a -type f )
> do
> diff <(sed -e '$a\' $f) <(sed -e '$a\' b/${f#*/})
> done
Una versione leggermente più dettagliata:
$ 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\'
fa esattamente? thx