Apakah ada alat Linux seperti diff yang secara rekursif akan membandingkan file dan direktori, tetapi dengan tambahan juga membandingkan: atribut diperluas, acl, konteks se?
Apakah ada alat Linux seperti diff yang secara rekursif akan membandingkan file dan direktori, tetapi dengan tambahan juga membandingkan: atribut diperluas, acl, konteks se?
Jawaban:
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.
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
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.
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