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 --delete
mengingat untuk menambahkan -n
dan -i
bendera.
Ini sedikit berlawanan dengan intuisi, tetapi bersabarlah. rsync
Perintah utama adalah apa yang Anda perlukan untuk menyinkronkan dua direktori bersamaan. Tetapi -n -i
menyebabkan 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 ls
atau 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 stat
mengatakan:
%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
find
memiliki fitur-fitur GNU stat
bawaan (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 /a
vs /b
di 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 stat
alih-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