Bir dizin ağacını hash kullanarak manifest dosyasına karşı karşılaştıran diff -r gibi bir araç var mı?


-1

İşte benim durumum. Aynı veri kümelerini içermesi gereken iki soğuk depo arşiv birimim var. Bu birimler, nadiren erişilen yedekleri içerir. Sonunda, bitrotun bunlardan birine veya ikisine ulaşması ve içinde yer alan verileri ustaca bozması konusunda endişeliyim. diff -rİki birimi bulabildiğimi ve ikisi arasında değişen veya kaybolan dosyaları bulabileceğimi biliyorum , ancak hangi birimin "iyi" kopyasına sahip olduğuna dair hiçbir yardımcı gösterge almıyorum. Bunlar USB diskler ve onları ZFS gibi bir şeye dönüştürmek zor görünüyor.

İstediğim şey, dizin ağacını özyinelemeli olarak yürüyecek ve dosya içeriğinin bir karması ile birlikte yolu ve dosya adını içeren bir bildirim dosyası yazacak bir araçtır. Verileri her birime yazdıktan hemen sonra bu aracı çalıştırırım ve ortaya çıkan manifest dosyasını ılık depoda, belki de bir çeşit revizyon kontrolü altında saklardım.

Bu dosyadan tam olarak çalışan bir şeyi çalıştırabilmek diff -risterdim - bana dosyalar eklenmiş, kaldırılmış veya içerikleri değiştirilmiş mi diye söylerdi. Yalnızca bir birimi diğerine karşılaştırmak yerine, bir birimi bilinen iyi bildirim dosyasıyla karşılaştırır. Bu yöntemi kullanarak, gelecekte ay / yıl diskten okuduğum verilerin orijinal olarak koyduğum verilerle aynı olup olmadığını belirleyebilmeliyim.

Böyle bir şeyin zaten var olduğunu düşünmek zorunda kalacağım. Aşağıdakileri kullanarak bir bildirim dosyasına yaklaşan bir şey bulabilirim:

find /mnt/my-volume -type f -exec md5sum {} + > manifest.txt

ancak şimdiye kadar bu dosyayı ayrıştırmak ve her hasha özyinelemeli kontrol etmek için iyi bir yol bulamadım. Ayrıca, daha az önemlisi, bu boş bir dizinin görünüp görünmediğini söylemez. (Neden önemli olduğunu düşünemiyorum, ama gerçekleştiğini bilmek güzel olurdu.)

Bununla doğru yolda mıyım, yoksa bu tür bir şeyi yapabilecek daha uygun bir araç var mı?

Yanıtlar:


2

Haklısın, böyle bir araç zaten var. Yazınızın 'linux' olarak etiketlendiğini görmeme rağmen, belki de BSD odaklı bir çözüm kurgulanıyor olacak.

FreeBSD'nin mtree (8) yardımcı programı tam olarak istediğiniz şeyi yapabilir.

varsayalım:

$ find .
.
./c
./c/file3
./b
./b/file2
./a
./a/file1

Her dosyanın sha256 karması da dahil olmak üzere, o dosya heirarşisinin bir tezahürünü oluşturmak için:

$ mtree -c -K sha256 > /tmp/manifest.txt
$ cat /tmp/manifest.txt
#          user: diego
#       machine: myhost.example.com
#          tree: /data/home/diego/foo
#          date: Wed Mar 28 10:31:17 2018

# .
/set type=file uid=1001 gid=1001 mode=0710 nlink=1 flags=uarch
.               type=dir nlink=5 time=1522257963.738221000

# ./a
/set type=file uid=1001 gid=1001 mode=0600 nlink=1 flags=uarch
a               type=dir mode=0710 nlink=2 time=1522257932.680802000
    file1       size=29 time=1522257932.682389000 \
                sha256digest=6b4114c4f12e63c0ca44073de5ca0a2b39fedaceaa533af3dfdc89f00039c973
# ./a
..


# ./b
b               type=dir mode=0710 nlink=2 time=1522257937.929131000
    file2       size=29 time=1522257937.930666000 \
                sha256digest=9f7a0a49475bb6f98e609a4e057f0bc702c5e4706be5bd656a676fd8d15da7ef
# ./b
..


# ./c
c               type=dir mode=0710 nlink=2 time=1522257942.064315000
    file3       size=29 time=1522257942.065882000 \
                sha256digest=bd617f47217ef0605d3aff036778d10bf18cb2f415c45e8e362e2c091df19491
# ./c
..

Bir daha sonra, bildiriyi mtree içine aktararak, bildirime karşı heirarşi dosyasını doğrulayabilir:

$ mtree < /tmp/manifest.txt || echo fail

Eklenen, silinen, yeniden adlandırılan veya değiştirilen dosyalar doğrulamanın başarısız olmasına neden olur:

$ touch foo
$ mtree < /tmp/manifest.txt || echo fail
.:      modification time (Wed Mar 28 10:34:56 2018, Wed Mar 28 10:37:01 2018)
extra: foo
fail
$ rm foo; touch b/file2; mtree < /tmp/manifest.txt || echo fail
.:      modification time (Wed Mar 28 10:34:56 2018, Wed Mar 28 10:39:39 2018)
b/file2: 
        modification time (Wed Mar 28 10:25:37 2018, Wed Mar 28 10:39:39 2018)
fail
$ mv c/file3 c/FILE3; rm a/file1; date >> b/file2; mtree < /tmp/manifest.txt || echo fail
.:      modification time (Wed Mar 28 10:34:56 2018, Wed Mar 28 10:39:39 2018)
c:      modification time (Wed Mar 28 10:25:42 2018, Wed Mar 28 10:41:59 2018)
extra: c/FILE3
b/file2:
        size (29, 58)
        modification time (Wed Mar 28 10:25:37 2018, Wed Mar 28 10:47:31 2018)
        sha256digest (0x9f7a0a49475bb6f98e609a4e057f0bc702c5e4706be5bd656a676fd8d15da7ef, 0x569c17bd1a1ca2447fd8167f103531bf3a7b7b4268f0f68b18506e586e7eea94)
a:      modification time (Wed Mar 28 10:25:32 2018, Wed Mar 28 10:41:59 2018)
./a/file1 missing
./c/file3 missing
fail

1

Bu md5sum -c manifest.txt, depolanan yolları onurlandırır manifest.txt. findProgram yerine {}belirtilen herhangi bir arama konumu dahil bulunan dosyanın tam yolunu finddosya için yani komut satırında, ./a/b/c/d/eaynı yerine yerleştirir ./a/b/c/d/ekomut için find ./a -type f -exec md5sum {} \;

Muhtemel mesele mutlak yollardır, bu yüzden daha uygun olan 'tezahür oluşturma komutu' daha uygundur:

cd /mnt/my-volume; find  -type f -exec md5sum {} + > manifest.txt

ancak, yolları her zaman sedmainfest.txt dosyasıyla düzeltebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.