Apakah ada alat Linux deep diff yang juga membandingkan atribut file?

17

Apakah ada alat Linux seperti diff yang secara rekursif akan membandingkan file dan direktori, tetapi dengan tambahan juga membandingkan: atribut diperluas, acl, konteks se?

Michael Gantz
sumber
1
Jawaban yang diberikan berfungsi untuk melakukan perbandingan sesekali. Tetapi, mereka tidak memadai untuk melakukan perbandingan jenis ini beberapa kali dalam satu jam saat menguji perangkat lunak. Saya mungkin cenderung memodifikasi kode sumber diff untuk memasukkan perbandingan ini.
Michael Gantz

Jawaban:

7

Saya sudah melakukan ini sebelum menggunakan rsync -aHAX --deletemengingat untuk menambahkan -ndan -ibendera.

Ini sedikit berlawanan dengan intuisi, tetapi bersabarlah. rsyncPerintah utama adalah apa yang Anda perlukan untuk menyinkronkan dua direktori bersamaan. Tetapi -n -imenyebabkan TIDAK untuk menyinkronkan (yaitu melakukan lari kering) dan hanya mencetak apa yang akan dilakukan dan mengapa. Ini tidak fantastis untuk diurai, tetapi Anda bisa mendapatkan nama file dengan mudah dan pipa lsatau sejenisnya.

Ini akan melihat segala sesuatu termasuk mtimes, tanggal dll., Serta tidak menindaklanjuti node perangkat, soket, pipa bernama dll. Baris perintah di atas melihat ACL dan atribut diperluas juga. Anda dapat menyesuaikan apa yang Anda lihat dengan mengubah opsi rsync, membatasinya pada satu perangkat dengan -x, mengubah perilaku tautan lunak & keras, dll. Dll.

abligh
sumber
2

janos sudah mengatakan apa yang harus dilakukan:

find /a -exec stat -c '%A %C %F %g %u %s %Y %n' {} \; >a
find /b -exec stat -c '%A %C %F %g %u %s %Y %n' {} \; >b

diff -u a b

Dan man 1 statmengatakan:

%A     access rights in human readable form
%C     SELinux security context string
%F     file type
%g     group ID of owner
%u     user ID of owner
%s     total size, in bytes
%Y     time of last modification, seconds since Epoch
%n     file name

Untuk membandingkan konten file yang dapat Anda gunakan:

find -type f -exec md5sum '{}' ';' | sort | uniq --all-repeated=separate -w 33 | cut -c 35-

as described here: http://www.commandlinefu.com/commands/view/3555/find-duplicate-files-based-on-size-first-then-md5-hash

sumber
Solusi ini tidak memberikan solusi yang bisa diterapkan. Perbedaan yang ditampilkan bebas konteks dan terlalu sulit untuk dibaca. Saya mencari sesuatu yang dapat menunjukkan kepada saya nama file dan apa yang berbeda tentangnya. Bukan perbedaan pada dua penemuan yang merupakan binatang yang sama sekali berbeda.
Michael Gantz
1
GNU findmemiliki fitur-fitur GNU statbawaan (dan mendahului status GNU selama beberapa dekade). Anda juga ingin mengurutkan output sebelum melakukan diffing. Dan Anda perlu (cd /a && find . ...)sebaliknya semua baris akan berbeda karena /avs /bdi jalur file.
Stéphane Chazelas
0

Berikut ini skrip bash cepat yang saya tulis untuk membandingkan atribut yang diperluas. Itu mencetak setiap nama file, dan kemudian perbedaan atribut:

cd a
export relpath=[path/to/b/from/a]

for filename in $(find .);
do
    echo $filename;
    diff <(xattr -l $filename) <(xattr -l $relpath/$filename);
done

Meminjam dari jawaban lain, kita dapat memodifikasi ini untuk digunakan statalih-alih xattr:

for filename in $(find .);
do
    echo $filename;
    diff <(stat -c '%A %C %F %g %u %s %Y' $filename) <(stat -c '%A %C %F %g %u %s %Y' $relpath/$filename);
done
Aaron Campbell
sumber