Najlepszy sposób na porównanie (różnicę) pełnej struktury katalogów?

29

Jaki jest najlepszy sposób porównywania struktur katalogów?

Mam narzędzie do tworzenia kopii zapasowych, które korzysta z rsync . Chcę powiedzieć dokładne różnice (pod względem rozmiarów plików i daty ostatniej zmiany) między źródłem a kopią zapasową.

Coś jak:

Local file                   Remote file                         Compare
/home/udi/1.txt (date)(size)   /home/udi/1.txt (date)(size)     EQUAL
/home/udi/2.txt (date)(size)   /home/udi/2.txt (date)(size)     DIFFERENT

Oczywiście narzędzie może być gotowe lub pomysł na skrypt Pythona.

Wielkie dzięki!

Udi

Adam Matan
źródło

Odpowiedzi:

18

Narzędzie, którego szukasz, to rdiff . Działa jak łączenie rsync i diff. Tworzy plik łatki, który można porównać lub rozpowszechnić.

Brianegge
źródło
9

Niektórzy ludzie chcą porównywać systemy plików z różnych powodów, więc napiszę tutaj, czego chciałem i jak to zrobiłem.

Chciałem:

  • Aby porównać ten sam system plików z samym sobą, tj. Migawka , wprowadź zmiany , migawka , porównaj .
  • Lista plików, które zostały dodane lub usunięte, nie dbała o wewnętrzne zmiany plików.

Co ja zrobiłem:

Pierwsza migawka ( before.shskrypt):

find / -xdev | sort > fs-before.txt

Druga migawka ( after.shskrypt):

find / -xdev | sort > fs-after.txt

Aby je porównać ( diff.shskrypt):

diff -daU 0 fs-before.txt fs-after.txt | grep -vE '^(@@|\+\+\+|---)'

Zaletą jest to, że używa to prawie domyślnych systemowych plików binarnych. Mając to porównanie na podstawie zawartości można zrobić przekazując findto -execparametr, który echem ścieżkę oraz MD5 po tym.

Camilo Martin
źródło
8

jeśli nie masz ochoty instalować innego narzędzia ...

for host in host1 host2
do
  ssh $host ' 
  cd /dir &&
  find . |
  while
    read line
  do
    ls -l "$line"
  done ' | sort  > /tmp/temp.$host.$$
done
diff /tmp/temp.*.$$ | less
echo "don't forget to clean up the temp files!"

I tak, można to zrobić za pomocą find i exec lub find i xargs tak łatwo, jak find w pętli for. A także, możesz ładnie wyprowadzić dane wyjściowe diff, aby mówiło coś takiego: „ten plik znajduje się na hoście 1, ale nie na hoście 2” lub w niektórych innych, ale w tym momencie możesz równie dobrze zainstalować narzędzia, o których wszyscy mówią ...

Chris
źródło
5

W przeszłości używałem dirdiff do porównywania struktur katalogów. Działa tylko w lokalnych katalogach, więc będziesz musiał sshfszamontować inne katalogi.

Dobrą rzeczą jest to, że możesz zobaczyć wizualnie, czy pliki są równe, czy nie, i który jest nowszy lub starszy. I obsługuje do 5 katalogów. Możesz także zobaczyć różnice i kopiować pliki z jednego do drugiego.

chmeee
źródło
4

Ze strony man rsync:

-n, --dry-run
This  makes rsync perform a trial run that doesn’t make any changes (and produces mostly
the same output as a real run).  It is most commonly used in combination  with  the  -v,
--verbose  and/or -i, --itemize-changes options to see what an rsync command is going to
do before one actually runs it.

Może to pomoże.

Saurabh Barjatiya
źródło
Dzięki, ale to nie rozwiązuje mojego problemu (szukam różnicy, która faktycznie odróżnia różnice).
Adam Matan
4

diff -rfaktycznie działa całkiem dobrze. Jeśli chcesz tylko wiedzieć, czy pliki się różnią, a nie faktyczną zawartość różnic, zrób todiff -qr

AlexB
źródło
1
-roznacza rekurencyjny, nie łączy się ze zdalnym hostem!
Michael Hampton
3

Użyłbym do tego Melda.

pupeno
źródło
Meld działa naprawdę dobrze, jeśli potrzebujesz rozwiązania GUI.
Drew Noakes
2

Poza narzędziami wymienionymi już w systemie Windows, których można użyć Total Commander lub WinSCP, oba mają bardzo wygodne funkcje do porównywania (i synchronizowania) katalogów.


źródło
0

Tak naprawdę nie chciałem instalować niczego nowego, więc moje rozwiązanie jest nieco prymitywne, ale szybkie i skuteczne.

Chciałem porównać wszystkie pliki zostały skopiowane, a ich tryb, własność i kontekst bezpieczeństwa SELinuksa pozostają niezmienione.

Więc pobiegłem:

rsync -aX /orig /copy/

a następnie porównaj tak:

cd /orig && ls -lZR > /tmp/diff_orig
cd /copy && ls -lZR > /tmp/diff_copy
vimdiff /tmp/diff_*

Jeśli zawartość obu plików pozostaje zwinięta, są one identyczne. Jeśli nie, pokazana zostanie różnica.

Zaktualizuj parametry, lsaby odzwierciedlały atrybuty, które musisz sprawdzić. YMMV

helvete
źródło