Ochiq
Yopish

Linux hajmi bo'yicha fayllarni taqqoslash. Vizual taqqoslash va birlashma mojarolarini hal qilish vositalarining umumiy ko'rinishi. Buyruq sintaksisi diff ga o'xshaydi



Linux terminalida ikkita faylni solishtirish (6)

Mana bu uchun mening yechimim:

Mkdir temp mkdir natijalari cp /usr/share/dict/american-english ~/temp/american-english-dictionary cp /usr/share/dict/british-english ~/temp/british-english-dictionary cat ~/temp/amerikan -inglizcha-lug'at | wc -l > ~/results/count-amerikan-inglizcha-lug'ati cat ~/temp/british-english-dictionary | wc -l > ~/results/count-british-inglizcha-lug'ati /umumiy-english ~/temp/amerikan-inglizcha-lug'ati > ~/natijalar/unique-american-english grep -Fxvf ~/results/common-english ~/temp/british-english-dictionary > ~/results/unique-british -ingliz

Ikkita fayl nomi bor "a.txt" Va "b.txt", y ulardan so'zlar ro'yxati mavjud. Endi men qaysi so'zlarga qo'shilganligini tekshirmoqchiman "a.txt" va ichida emaslar "b.txt" .

Menga samarali algoritm kerak, chunki ikkita lug'atni solishtirishim kerak.

Ikki faylni solishtirish uchun Linuxda diff vositasidan foydalanishingiz mumkin. Kerakli ma'lumotlarni filtrlash uchun siz foydalanishingiz mumkin variantlar --o'zgartirilgan-guruh-format Va --o'zgarmagan-guruh formati .

Har bir variant uchun mos guruhni tanlash uchun quyidagi uchta variantdan foydalanish mumkin:

    "% <" получить строки из FILE1

    "%>" FILE2 dan qatorlarni oladi

    "" (bo'sh qator) ikkala fayldan qatorlarni olib tashlash uchun.

Masalan: diff --changed-group-format = "%<" --unchanged-group-format = "" file1.txt file2.txt

[ tmp]# cat file1.txt test bir test ikki sinov uch sinov to'rt test sakkiz [ tmp]# cat file2.txt test bir test uch test to'qqiz [ tmp]# diff --changed-group-format="%<" --unchanged-group-format="" file1.txt file2.txt test two test four test eight

Agar siz git diff ning diff chiqish uslubini afzal ko'rsangiz, uni git repozitoriyasida bo'lmagan fayllarni solishtirish uchun --no-index bayrog'i bilan ishlatishingiz mumkin:

Git diff --no-index a.txt b.txt

Har birida 200k fayl nomi satrlari bo'lgan bir nechta fayldan foydalanib, men ushbu yondashuvni va boshqa javoblarni (o'rnatilgan vaqt buyrug'i bilan) solishtirdim:

Git diff --no-index a.txt b.txt # ~1.2s comm -23<(sort a.txt) <(sort b.txt) # ~0.2s diff a.txt b.txt # ~2.6s sdiff a.txt b.txt # ~2.7s vimdiff a.txt b.txt # ~3.2s

comm hozirgacha eng tezkor ko'rinadi, git diff --no-index esa diff uslubidagi chiqish uchun eng tezkor yondashuv bo'lib ko'rinadi.

Yangilanish 2018-03-25 Aslida agar siz git omborida bo'lmasangiz va o'sha ombordagi o'ynatib bo'lmaydigan fayllarni solishtirmoqchi bo'lsangiz --no-index bayrog'ini o'tkazib yuborishingiz mumkin. Man sahifalaridan:

Ushbu shakl ikkita fayl tizimi yo'lidagi ma'lumotlarni solishtirish uchun mo'ljallangan. Git tomonidan boshqariladigan ishchi daraxtda buyruqni ishga tushirishda va ishchi daraxtdan tashqaridagi yo'l nuqtalaridan kamida bittasida yoki buyruqni Git tomonidan boshqariladigan ishchi daraxtdan tashqarida ishga tushirishda -no-index parametrini o'tkazib yuborishingiz mumkin.

comm -13 dan foydalaning (tartiblangan fayllarni talab qiladi) :

$ mushuk fayl1 bir ikki uch $ mushuk fayl2 bir ikki uch to'rt $ comm -13<(sort file1) <(sort file2) four

Ularni tartiblang va comm dan foydalaning:

Comm-23<(sort a.txt) <(sort b.txt)

comm kirish fayllarini taqqoslaydi (tartiblaydi) va sukut bo'yicha uchta ustunni chiqaradi: a uchun yagona bo'lgan satrlar, b uchun yagona bo'lgan satrlar va ikkalasida mavjud bo'lgan satrlar. -1 , -2 va/yoki -3 ni belgilash orqali siz mos keladigan chiqishni bosishingiz mumkin. Shuning uchun comm -23 ab faqat a uchun xos bo'lgan yozuvlarni ko'rsatadi. Men foydalanadigan sintaksis<(...) для сортировки файлов на лету, если они уже отсортированы, вам это не нужно.

Agar sizda vim o'rnatilgan bo'lsa, buni sinab ko'ring:

Vimdiff fayl 1 fayl 2

Vim -d fayl 1 fayl2

siz uni fantastik deb topasiz.

Linuxda ikki yoki undan ortiq fayllarni solishtirish uchun diff buyrug'i mavjud. U alohida fayllar va kataloglarni solishtirishi mumkin. Keling, diff buyrug'ining sintaksisi, variantlari va ba'zi foydalanish misollarini ko'rib chiqaylik.

diff buyrug'i sintaksisi

Diff buyrug'i quyidagi sintaksisga ega:

Diff [variantlar] fayllar yoki kataloglar

Biz variantlarni belgilaymiz va solishtirishimiz kerak bo'lgan ikki yoki undan ortiq fayl yoki kataloglarni taqdim etamiz.

diff buyruq variantlari

Diff buyrug'ining asosiy variantlarini ko'rib chiqamiz. Men faqat tez-tez foydalanadigan variantlarni ko'rib chiqaman.

-EMatnga yorliq belgisi qoʻshish natijasida yuzaga kelgan oʻzgarishlarga eʼtibor bermang.
-bBoʻsh joy qoʻshish natijasida yuzaga kelgan oʻzgarishlarga eʼtibor bermang.
-wBo'shliqlar va yorliqlarni qo'shishni o'z ichiga olgan o'zgarishlarga e'tibor bermang.
-Byangi bo'sh qatorlarni e'tiborsiz qoldiring.
-p (yoki --show-c-funktsiyasi)o'zgarishlar topilgan C tili funksiyasining nomini ko'rsating.
-y (yoki --yonma-yon)natijalarni ikkita ustunda ko'rsatish.
-rkataloglarni rekursiv ko'rib chiqish.
-X FILEnomlari FILE faylidagi naqshlarga mos keladigan qidiruv fayllaridan chiqarib tashlang.
-d (yoki --minimal)iloji boricha kamroq o'zgarishlarni topishga harakat qiling (ya'ni noto'g'ri pozitivlarni istisno qiling).

Diff buyrug'idan foydalanishga misollar

Ikki matnli faylni solishtirish

myfile1 va myfile2 nomli ikkita matnli faylni oddiygina solishtirish uchun terminalda buyruqni bajaring:

Farq myfile1 myfile2

Diff buyrug'ining chiqishini diff kengaytmali faylga yo'naltirish qulay. Gedit kabi ko'pgina Linux matn muharrirlari ushbu faylni taniydi va uning sintaksisini ta'kidlaydi. Taqqoslash natijasini change.diff fayliga yo'naltirish uchun oqimni qayta yo'naltirish belgisidan (>) foydalanish kerak:

Farq myfile1 myfile2 > changes.diff

Matnli fayllarni o'z ichiga olgan kataloglarni taqqoslash

Keling, matnli fayllarni o'z ichiga olgan ikkita katalogni (mydir1 va mydir2) solishtirish misolini ko'rib chiqaylik. Bu erda yuqoridagi misoldan asosiy farq shundaki, biz -r variantini qo'shamiz, ya'ni u kataloglardagi fayllarni rekursiv ravishda kesib o'tadi.

Diff -r mydir1 mydir2 > change.diff

Endi faraz qilaylik, biz fayllarni solishtirayotgan kataloglarda biz solishtirmasligimiz kerak bo'lgan juda ko'p "axlat" mavjud. Keling, excludeFiles faylini yaratamiz va unga solishtirmaslik kerak bo'lgan fayllarning naqshlari va nomlarini yozamiz. Misol uchun, excludeFiles tarkibi quyidagicha ko'rinishi mumkin:

*.o ChangeLog* *.bak *.exe

Endi kataloglarni solishtirishda diff buyrug'iga bizning excludeFiles faylimizdan foydalanishni aytamiz:

Diff -r -X excludeFiles mydir1 mydir2 > change.diff

Shunday qilib, biz nomlari excludeFiles faylidagi naqshlarga mos kelmaydigan fayllarni solishtiramiz, masalan, vasya.exe yoki ChangeLog12.

Taqqoslash natijasini yaxshilash uchun yuqorida tavsiflangan yana bir nechta variantlarni qo'shamiz:

Diff -rwBd -X excludeFiles mydir1 mydir2 > change.diff

Biz mydir1 va mydir2 kataloglaridagi fayllarni boʻsh satrlar, boʻshliqlar, yorliqlar qoʻshish tufayli oʻzgarishlarga eʼtibor bermay, solishtiramiz, shuningdek, keraksiz fayllarni taqqoslashdan chiqarib tashlash uchun excludeFilesʼdagi fayl nomi naqshlaridan foydalanamiz.

Xulosa

Linux tizimingizda diff buyrug'idan foydalanish haqida qo'shimcha ma'lumot olish uchun quyidagi buyruqni bajarishingiz mumkin:

Odam farqi

Grafik interfeys yordamida fayllarni solishtirish imkonini beruvchi dasturlar ham mavjud. Masalan, fayllarda qaerda va nima o'zgarganligini vizual ravishda ko'rsatadigan Meld dasturi.

), ularning taqqoslashlari, shuningdek, ular uchun GUI mijozlarini taqqoslash. Shuningdek, git va mercurial bilan ishlash uchun IDE plaginlari haqida munozaralar bo‘lib o‘tdi. Lekin amalda hech qanday ma'lumot yo'q edi vizual taqqoslash va nizolarni hal qilish vositalarini birlashtirish haqida.

Men yaqinda mercurialdan (buni hali ham qulayroq va mantiqiy deb hisoblayman) git-ga "sakrab o'tdim", chunki men uchun qiziqarli bo'lgan loyihalarning aksariyati git-dan foydalanadi va github-da joylashgan. Shu munosabat bilan, asboblar arsenalini qayta ko'rib chiqish, xususan, savol tug'ildi asbob tanlash vizual taqqoslash va birlashtirish (diff va birlashma). Hubdagi ma'lumotlarning etishmasligini to'ldirish uchun men ushbu mini-sharhni yozishga qaror qildim. Ular aytganidek - issiq ta'qibda.

Kesim ostida siz Windows ostida DiffMerge va WinMerge bilan foydalanish uchun Git sozlamalari misollarini topasiz. Menimcha, bu ko'p vaqtni tejaydi.

Ism Xususiyatlari Platforma

KDiff3

Git va WinMerge

1) Katalogga qo'shing c:/Git/libexec/git-core/mergetools/
winmerge fayli quyidagi tarkibga ega:

Diff_cmd () ( "c:/Program Files (x86)/WinMerge/WinMergeU.exe" \ "$LOCAL" "$REMOTE" >/dev/null 2>&1 ) merge_cmd () ( "c:/Program Files (x86) )/WinMerge/WinMergeU.exe" \ "$PWD/$LOCAL" "$PWD/$REMOTE" "$PWD/$MERGED" >/dev/null 2>&1 status=$? )
Git avtomatik ravishda o'zgarishlarni birlashtira olmasa, birlashma mojarosi yuzaga keladi va birlashma belgilari ziddiyatli faylga qo'shiladi (<<<<<<<, =======, и >>>>>>>). Ular uchinchi tomon vositalaridan foydalangan holda mojaroni hal qilish uchun zarurdir.
Keling, faylni ko'rib chiqaylik readme.txt shoxlarning birlashishi natijasida hosil bo'lgan usta va yangi yuqoridagi misolda:

<<<<<<< HEAD master str ======= new str >>>>>>> yangi
Biz ziddiyatni hal qilish uchun WinMerge dasturi yordamida ziddiyat faylini ochishimiz mumkin.

Bu ikki tomonlama birlashtirish vositasini ochadi:

Ta'riflangan mantiqqa asoslanib, biz birlashtirish buyrug'ini qayta yozamiz birlashtirish_cmd quyida bayon qilinganidek:
merge_cmd() ( "c:/Program Files (x86)/WinMerge/WinMergeU.exe" \ "$MERGED" >/dev/null 2>&1 status=$? )
Aslida, yuqoridagi variantlarning ikkalasi ham tengdir.

2) Keling, tahrir qilaylik .gitconfig
asbob = winmerge cmd = "winmerge" vositasi = winmerge cmd = "winmerge" trustExitCode = noto'g'ri keepBackup = noto'g'ri
Oxirgi qator zaxira fayllarni ombor katalogiga saqlashni bekor qiladi.

3) Ikki filialni birlashtirganda ziddiyat yarataylik (DiffMerge yordamida misolga qarang).
git difftool master new // ikkita filialni solishtiring

Filiallarni birlashtirishda ziddiyatni hal qilish uchun buyruqdan foydalaning
git mergetool

), ularning taqqoslashlari, shuningdek, ular uchun GUI mijozlarini taqqoslash. Shuningdek, git va mercurial bilan ishlash uchun IDE plaginlari haqida munozaralar bo‘lib o‘tdi. Lekin amalda hech qanday ma'lumot yo'q edi vizual taqqoslash va nizolarni hal qilish vositalarini birlashtirish haqida.

Men yaqinda mercurialdan (buni hali ham qulayroq va mantiqiy deb hisoblayman) git-ga "sakrab o'tdim", chunki men uchun qiziqarli bo'lgan loyihalarning aksariyati git-dan foydalanadi va github-da joylashgan. Shu munosabat bilan, asboblar arsenalini qayta ko'rib chiqish, xususan, savol tug'ildi asbob tanlash vizual taqqoslash va birlashtirish (diff va birlashma). Hubdagi ma'lumotlarning etishmasligini to'ldirish uchun men ushbu mini-sharhni yozishga qaror qildim. Ular aytganidek - issiq ta'qibda.

Kesim ostida siz Windows ostida DiffMerge va WinMerge bilan foydalanish uchun Git sozlamalari misollarini topasiz. Menimcha, bu ko'p vaqtni tejaydi.

Ism Xususiyatlari Platforma

KDiff3

Git va WinMerge

1) Katalogga qo'shing c:/Git/libexec/git-core/mergetools/
winmerge fayli quyidagi tarkibga ega:

Diff_cmd () ( "c:/Program Files (x86)/WinMerge/WinMergeU.exe" \ "$LOCAL" "$REMOTE" >/dev/null 2>&1 ) merge_cmd () ( "c:/Program Files (x86) )/WinMerge/WinMergeU.exe" \ "$PWD/$LOCAL" "$PWD/$REMOTE" "$PWD/$MERGED" >/dev/null 2>&1 status=$? )
Git avtomatik ravishda o'zgarishlarni birlashtira olmasa, birlashma mojarosi yuzaga keladi va birlashma belgilari ziddiyatli faylga qo'shiladi (<<<<<<<, =======, и >>>>>>>). Ular uchinchi tomon vositalaridan foydalangan holda mojaroni hal qilish uchun zarurdir.
Keling, faylni ko'rib chiqaylik readme.txt shoxlarning birlashishi natijasida hosil bo'lgan usta va yangi yuqoridagi misolda:

<<<<<<< HEAD master str ======= new str >>>>>>> yangi
Biz ziddiyatni hal qilish uchun WinMerge dasturi yordamida ziddiyat faylini ochishimiz mumkin.

Bu ikki tomonlama birlashtirish vositasini ochadi:

Ta'riflangan mantiqqa asoslanib, biz birlashtirish buyrug'ini qayta yozamiz birlashtirish_cmd quyida bayon qilinganidek:
merge_cmd() ( "c:/Program Files (x86)/WinMerge/WinMergeU.exe" \ "$MERGED" >/dev/null 2>&1 status=$? )
Aslida, yuqoridagi variantlarning ikkalasi ham tengdir.

2) Keling, tahrir qilaylik .gitconfig
asbob = winmerge cmd = "winmerge" vositasi = winmerge cmd = "winmerge" trustExitCode = noto'g'ri keepBackup = noto'g'ri
Oxirgi qator zaxira fayllarni ombor katalogiga saqlashni bekor qiladi.

3) Ikki filialni birlashtirganda ziddiyat yarataylik (DiffMerge yordamida misolga qarang).
git difftool master new // ikkita filialni solishtiring

Filiallarni birlashtirishda ziddiyatni hal qilish uchun buyruqdan foydalaning
git mergetool

Veb-ustalar yoki veb-sayt egalari ko'pincha tarkibga asoslangan ikkita faylni solishtirishlari kerak. Ushbu maqoladan siz ikkita faylni bir-biri bilan qanday solishtirishni o'rganasiz. Matn fayllari va skriptlarni (html, css, php va boshqalar) solishtirish uchun menga ma'lum bo'lgan barcha usullar bu erda tasvirlangan.

1-usul. Meld

Meld- farqlarni olish va ikkita fayl, ikkita katalogni birlashtirish uchun grafik vosita. Meld - bu Linux uchun vizual fayl va kataloglarni taqqoslash va birlashtirish vositasi. Meld birinchi navbatda ishlab chiquvchilarga qaratilgan. Biroq, fayllar va kataloglarni solishtirish uchun yaxshi vositaga muhtoj bo'lgan har qanday foydalanuvchi uchun foydali bo'lishi mumkin.

Meldda siz ikki yoki uchta faylni yoki ikkita yoki uchta katalogni solishtirishingiz mumkin. Ishchi nusxani CVS, Subversion, Bazaar-NG va Mercurial kabi mashhur versiyalarni boshqarish tizimlaridan ko'rishingiz mumkin. Meld ko'pgina Linux distributivlari (Ubuntu, Suse, Fedora va boshqalar) uchun mavjud va ularning asosiy omborlarida mavjud.

# qobiliyat o'rnatish meld

2-usul: WinMerge-da ikkita faylning mazmunini solishtirish.

Bepul WinMerge dasturi nafaqat fayllar tarkibini, balki butun papkalar tarkibini solishtirish imkonini beradi. WinMerge Windows uchun ochiq manbali farqlash va birlashtirish vositasidir. WinMerge ikkala fayl va papkalarni solishtirishi mumkin, bu farqlarni tushunish va qayta ishlash oson bo'lgan vizual matn shaklida ko'rsatishi mumkin.

O'rnatishdan so'ng, "Fayl" - "Ochish" menyusini oching. Taqqoslash uchun fayllarni tanlang. Buning uchun "Browse" tugmasini bosing va faylni tanlang. Fayllarni tanlagandan so'ng, "OK" tugmasini bosing.

Bundan tashqari, WinMerge-da fayllarni tahrirlashingiz mumkin. Taqqoslash oynasini yopgandan so'ng, dastur fayllarga kiritilgan o'zgarishlarni saqlashni taklif qiladi.

3-usul. farq

farq- ikkita fayl orasidagi farqni ko'rsatadigan fayllarni taqqoslash yordam dasturi.

    Kataloglarni solishtirish uchun quyidagi buyruqdan foydalaning: $ diff -qr< current-directory> < backup-directory>

4-usul. solishtiring

Kompare - fayllar orasidagi farqlarni ko'rsatadi. Fayllar yoki kataloglarning mazmunini solishtirish, shuningdek, yamoq fayllarini yaratish, ko'rsatish va qo'llash mumkin. Kompare - bu fayllardagi farqlarni topish va ularni birlashtirish imkonini beruvchi grafik farqli yordamchi dastur. Qt tilida yozilgan va asosan KDE uchun mo'ljallangan. Mana uning asosiy xususiyatlari:

    Bir nechta farq formatlarini qo'llab-quvvatlaydi;

    Linux fayli va kataloglarini taqqoslashni qo'llab-quvvatlash;

    diff fayllarini ko'rishni qo'llab-quvvatlash;

    Moslashtirilgan interfeys;

    Fayllarga yamoqlarni yaratish va qo'llash.

Usul 5. Total Commander-da fayllarni solishtirish

    Qo'llab-quvvatlanadigan operatsion tizimlar: Windows

Total Commander-da fayllarni kontent bo'yicha taqqoslash vositasi mavjud bo'lib, unda siz nafaqat tarkibni solishtirishingiz, balki uni tahrirlashingiz va bir fayldan boshqasiga nusxalashingiz mumkin.

Total Commander-ni ishga tushirgandan so'ng - panellardan birida taqqoslash uchun birinchi faylni tanlang (Insert kalit) - ikkinchi panelda ikkinchi fayl bilan papkani oching va kursorni uning ustiga qo'ying. Taqqoslash uchun dasturga qo'ng'iroq qiling: "Fayllar → Kontent bo'yicha solishtiring."

Faylga o'zgartirishlar kiritish uchun "Tahrirlash" tugmasini bosing. Dastur nusxa ko'chirish va orqaga qaytarish, qidirish va kodlash funktsiyalarini taklif qiladi. Agar siz faylga o'zgartirishlar kiritgan bo'lsangiz, taqqoslash oynasini yopganingizdan so'ng, sizdan o'zgarishlarni saqlash so'raladi.

Usul 6. Notepad++ da fayllarni solishtiring

    Qo'llab-quvvatlanadigan operatsion tizimlar: Windows, Linuxda ishlashi mumkin

Notepad++ fayllarni solishtira olmaydi. Ushbu funksiya Notepad++ da paydo bo‘lishi uchun “Taqqoslash” plaginini o‘rnatishingiz kerak.

Tahrirlovchini ishga tushiring - "Pluginlar" - "Plugin menejeri" - "Plagin menejerini ko'rsatish" menyusiga o'ting. Yangi oynada "Taqqoslash" plaginini tanlang va "O'rnatish" tugmasini bosing.

Plaginni o'rnatgandan so'ng ikkita faylni oching va "Plaginlar" - "Taqqoslash" - "Taqqoslash (Alt+D)" menyusini tanlang. Fayllarni taqqoslash natijasi alohida panellarda taqdim etiladi. Farqlar topilgan chiziqlar qarshisida ogohlantirish belgisi paydo bo'ladi.

7-usul: Windows buyruq satridan foydalanib fayllarni solishtirish

Windows buyruq satri (cmd.exe) yordamida taqqoslash fayllarni tahrirlash imkonini bermaydi, lekin siz ushbu usul yordamida fayllar tarkibini shunchaki solishtirishingiz mumkin.

Windows buyruq qatorini ochish uchun "Ishga tushirish" - "Barcha dasturlar" - "Aksessuarlar" - "Buyruqning satri" ga o'ting yoki "Windows + R" tugmachasini bosing, cmd yozing va Enter tugmasini bosing.

Buyruqning satrida buyruqni kiriting:

fc / N ikkinchi faylga birinchi fayl yo'li