Porovnávání adresářů
Jirka Kosina
jikos na jikos.cz
Neděle Září 14 01:01:58 CEST 2003
On Sat, 6 Sep 2003, Oak wrote:
> už dlouho se trápím různýma složitýma postupama na vyhledávání duplicit
> souborů nebo celých adresářů. Vyzkoušel jsem několik programů, jako je
> Kompare (používá diff), ale ty slouží ke hledání _odlišností_ v přibližně
> shodných soubrech či adresářích, zatímco já bych potřeboval hledat _shody_
> v naprosto odlišných adresářích či celých soub. systémech (opak :-).
> Neexistuje něco šikovnýho? Za šikovnost bych považoval třeba porovnání
> obsahu (např. přes MD5), pokud se nějaké soubory shodují názvem, případně
> velikostí.
Pokud byste nejdriv chtel testovat ze se soubory shoduji ve velikosti a v
nazvu, a pak z nich pocital md5, mate to neoptimalne napriklad timto
zpusobem:
; vygenerovat pro oba adresare seznamy souboru s jejich velikostmi
find /nejaka/cesta -exec wc -c {} 2>/dev/null \; > FIRST
find /jina/cesta -exec wc -c {} 2>/dev/null \; > SECOND
; jednim while cyklem (v shellu) cist obsah souboru FIRST (napriklad)
; a v souboru SECOND k nemu hledat odpovidajici zaznamy. Neoptimalne
; treba pomoci grepu
cat FIRST | while read SIZE FNAME; do
BASE=`basename "$FNAME"`
echo "Hledam $BASE o velikosti $SIZE v SECOND"
RESULT=`grep "$SIZE .*$BASE" SECOND`
if [ -z "$RESULT" ]; then
echo "Neni tam"
else
echo "Je tam"
fi
done
Ve vetvi "Je tam" si pak jen spocitate MD5 soucty souboru $FNAME a
souboru, jehoz plne jmeno je druhy sloupec promenne $RESULT (ktere z teto
promenne vytahnete napriklad pomoci programu cut nebo awk), a hned vite,
jestli se jedna o stejne soubory nebo ne.
Toto se vyplati, pokud predpokladate, ze soubory jsou dostatecne velike a
nevyplatila by se na to ta uplne nejtupejsi metoda - tedy si spocitat
md5ky vsech souboru v obou porovnavanych adresarich, a pak je jen timto
zpusobem porovnat.
Navic je tento mnou navrhovany postup kvadraticky, co se tyce casove
slozitosti - pro kazdou radku souboru FIRST se znova prochazi (grepem)
soubor SECOND. Slo by to vylepsit, kdyby se vystupy setridily napriklad
podle velikosti (sort to udela v O(n*log(n))), a pak by se kandidati na
shodnou dvojici souboru hledaly a-la slevaci postup pri mergesortu, tedy v
O(n).
--
JiKos.
Další informace o konferenci Linux