Linux Format 139-140 Январь 2011

Page 58

Рецепты доктора Брауна

Ути­ли­ты срав­не­ния фай­лов Рас­смот­рим оп­ции Linux и уз­на­ем, за­чем срав­ни­вать фай­лы.

В

Представление фай­лов в Meld ли­цом к ли­цу ви­зу­аль­но под­во­ дит к раз­ли­чи­ям.

Linux до­воль­но мно­го ути­лит срав­не­ния фай­лов – вы­хо­дит, лю­д ям оно нуж­но. Но за­чем? Ну, на­при­мер, кто-то взял да от­ре­дак­ти­ро­вал ваш ро­ман, и вы хо­ти­те оце­нить при­ чи­нен­ный ущерб. Ес­ли у вас со­хра­ни­лась ко­пия ори­ги­на­ла, срав­ не­ние фай­лов бы­ст­ро вы­явит раз­ли­чия. Или – у вас ра­бо­чая кон­ фи­г у­ра­ция Apache на од­ном ком­пь­ю­те­ре и не­ра­бо­чая на дру­гом. Срав­не­ние фай­лов на­строй­ки проль­ет свет на при­чи­ну сбоя. Ес­ ли вы про­грам­мист и тру­ди­тесь над вер­си­ей 1.4 сво­его ше­дев­ра, ути­ли­ты срав­не­ния фай­лов под­ска­ж ут, на­сколь­ко она вы­рос­ла по срав­не­нию с 1.3. К это­му слу­чаю бли­зок та­кой: нуж­но объ­е­ди­ нить два фай­ла, ото­шед­ших от об­ще­го пред­ка. Срав­не­ние фай­ лов по­мо­жет оп­ре­де­лить пред­ва­ри­тель­ные из­ме­не­ния, не­об­хо­ди­ мые для слия­ния. Как мы уви­дим, в не­ко­то­рые ути­ли­ты срав­не­ния фай­лов встрое­на и функ­ция слия­ния фай­лов. Вы­вод ко­манд­ной стро­ки ути­лит срав­не­ния фай­лов (ко­то­рый мож­но пред­ста­вить как на­бор из­ме­не­ний, не­об­хо­ди­мых для пре­ вра­ще­ния ста­рой вер­сии фай­ла в но­вую) мож­но ис­поль­зо­вать для соз­да­ния фай­ла за­плат­ки. Та­кие фай­лы час­то на­зы­ва­ют «diffs» в честь клас­си­че­ской ути­ли­ты ко­манд­ной стро­ки. На­при­мер, на сай­те яд­ра Linux (www.kernel.org) есть за­плат­ки для об­нов­ле­ния ис­ход­но­го ко­да од­ной вер­сии яд­ра Linux до сле­дую­щей. Что­бы за­ гру­зить их, не нуж­но столь­ко тра­фи­ка, сколь­ко для за­груз­ки пол­ ных ис­ход­ных ко­дов яд­ра. Ана­ло­гич­но, раз­ра­бот­чи­ки яд­ра от­ прав­ля­ют свои об­нов­ле­ния в ви­де за­плат. Итак, ра­зо­брав­шись с мо­ти­ва­ци­ей, зай­мем­ся про­стой ути­ли­ той срав­не­ния CMP – она су­ще­ст­ву­ет с на­ча­ла эры Unix и ра­бо­та­ет с фай­ла­ми лю­бо­го ти­па. По су­ти, она по­байт­но срав­ни­ва­ет фай­ лы и со­об­ща­ет, где на­хо­дит­ся пер­вое раз­ли­чие. У нее есть флаг (-l), ко­то­рый ото­бра­жа­ет все раз­ли­чия, но не пы­та­ет­ся син­хро­ни­ зи­ро­вать со­дер­жи­мое: на­при­мер, ес­ли уда­лен все­го один байт, раз­лич­ны­ми ока­ж ут­ся все ос­таль­ные бай­ты в фай­лах. В мол­ча­ли­ вом ре­жи­ме (оп­ция -s) ути­ли­та про­сто воз­вра­ща­ет ста­т ус вы­хо­да (ноль – ес­ли фай­лы оди­на­ко­вы, и не ноль, ес­ли нет), и ею удоб­но поль­зо­вать­ся в скрип­тах обо­лоч­ки – на­при­мер, так: if cmp -s foo bar then echo foo and bar are identical fi Пе­рей­д я от од­ной край­но­сти к дру­гой, рас­мот­рим луч­шую гра­фи­че­скую ути­ли­т у срав­не­ния фай­лов – Meld (http://meld. sourceforge.net). Она на­пи­са­на на Python. Вы­ше при­ве­ден эк­ран­ ный сни­мок Meld со срав­не­ни­ем двух вер­сий фай­ла /etc/fstab. Вгля­дев­шись пов­ни­ма­тель­нее, вы уви­ди­те, что в но­вой вер­сии до­бав­ле­на стро­ка ком­мен­та­рия, од­на стро­ка уда­ле­на, а тре­тья

56      LXF139/140 Январь 2011

Meld 1.4.0

А ес­ли это не текст? Ути­ли­ты, о ко­то­рых мы го­во­ри­ли, ра­бо­та­ют толь­ко с тек­сто­вы­ми фай­ ла­ми, и их по­ле дея­тель­но­сти пу­гаю­ще су­жа­ет­ся при пе­ре­хо­де к фай­ лам дру­гих ти­пов. В OpenOffice.org пре­д у­смот­ре­но срав­не­ние до­к у­ мен­тов. Дву­сто­рон­не­го пред­став­ле­ния до­к у­мен­тов нет, но раз­ли­чия от­ме­ча­ют­ся встро­ен­ной раз­мет­кой. До­к у­мен­ты не срав­ни­ва­ют­ся пол­ но­стью: вы ска­че­те от од­но­го из­ме­не­ния к дру­го­му, при­ни­мая или от­ кло­няя ка­ж ­дое; од­на­ко не­ред­ки ошиб­ки оп­ре­де­ле­ния ми­ни­маль­но дос­та­точ­но­го на­бо­ра раз­ли­чий – час­то по­ме­ча­ет­ся пол-аб­за­ц а, ко­гда раз­ли­чие все­го в не­сколь­ко слов. Это по­ве­де­ние по­ка­за­но вни­зу спра­ ва на смеж­ной стра­ни­це. Для срав­не­ния изо­бра­же­ний имеются ути­ли­ты, оп­ре­де­ляю­щие дуб­ли­ка­ты в ва­шей кол­лек­ции фо­то­гра­фий, но все они, ка­жет­ся, для Windows. По­рыв­шись, я об­на­ру­жил про­грам­му под на­зва­ни­ем Perceptualdiff, ко­то­рая ра­бо­та­ет в Linux и ис­поль­зу­ет «вы­чис­ли­тель­ ную мо­дель ви­зу­а ль­ной сис­те­мы че­ло­ве­ка» для оп­ре­де­ле­ния ви­ ди­мо­го раз­ли­чия ме­ж ­д у дву­мя изо­бра­же­ния­ми (под­дер­жи­ва­ют­ся фор­ма­ты TIFF и PNG). Мож­но за­дать не­сколь­ко па­ра­мет­ров (ука­зав чув­ст­ви­тель­ность срав­не­ния) и по­лу­чить про­стой ре­зуль­тат «оди­на­ ко­вы/не­оди­на­ко­вы» (PASS/FAIL): $ perceptualdiff screenshot1.png screenshot2.png FAIL: Images are visibly different 114 pixels are different Не­что боль­шее, на­вер­ное, уже за пре­де­ла­ми ин­тел­лек­та ком­ пьютера.

стро­ка чуть из­ме­ни­лась. Ви­зу­а ль­ное удоб­ст­во Meld в ото­бра­же­ нии раз­ли­чий яс­но из сним­ка, но у не­го есть и дру­гие, не столь оче­вид­ные воз­мож­но­сти. На­при­мер, за­те­нен­ные по­лос­ки по кра­ям, спра­ва и сле­ва, по­ка­ зы­ва­ют, где имен­но на­хо­д ят­ся раз­ли­чия внут­ри фай­ла. Ко­неч­но, это по­лез­нее на бо­лее длин­ных фай­лах, чем по­ка­зан­ный здесь. Так­же дос­т уп­на цве­то­вая под­свет­ка син­так­си­са с GtkSourceView (как в Gedit). Дру­гая при­ят­ная ме­лочь – фай­лы мож­но ре­дак­ти­ро­ вать пря­мо в Meld, а diffs бу­д ут об­нов­лять­ся ав­то­ма­ти­че­ски. Есть и дру­гие гра­фи­че­ские ути­ли­ты срав­не­ния фай­лов в том же сти­ле – на­при­мер, Tkdiff (см. сни­мок ввер­х у спра­ва или на сай­ те http://sourceforge.net/projects/tkdiff), ме­нее глян­це­вый, чем Meld, или Xxdiff (да­же ме­нее глян­це­вый, чем Tkdiff) и Kompare из KDE, ко­то­рый здо­ро­во вы­гля­дит на сво­ем сай­те (www.caffeinated. me.uk/kompare), но при­вес­ти его в ра­бо­чее со­стоя­ние, что­бы сде­ лать сни­мок, бы­ло не­про­сто. В бо­лее де­ше­вом сег­мен­те рын­ка, по край­ней ме­ре в смыс­ле ви­зу­а ль­ной при­вле­ка­тель­но­сти, клас­си­че­ская ути­ли­та срав­не­ния фай­л ов – это diff. По­с мот­р им, как она пред­с та­в ит из­м е­н е­н ия в тех же двух фай­лах fstab: $ diff fstab.old fstab.new 1a2 > # Home directories on separate drive 4d4 < /dev/fd0 /media/floppy auto rw,noauto,user,sync 0 0 6c6 < /dev/hda1 swap swap pri=42 0 0 --> /dev/hda1 swap swap defaults 0 0 Из­ме­не­ния в diff по­ме­че­ны бу­к­ва­ми a (до­бав­ле­но), d (уда­ле­но) и c (из­ме­не­но). Чис­ла от­но­сят­ся к но­ме­рам строк в фай­лах сле­ ва и спра­ва. Та­ким об­ра­зом, 6c6 оз­на­ча­ет, что из­ме­не­ние бы­ло,


Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.