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.
[ 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 eightMasalan: diff --changed-group-format = "%<" --unchanged-group-format = "" file1.txt file2.txt
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.
-E | Matnga yorliq belgisi qoʻshish natijasida yuzaga kelgan oʻzgarishlarga eʼtibor bermang. |
-b | Boʻsh joy qoʻshish natijasida yuzaga kelgan oʻzgarishlarga eʼtibor bermang. |
-w | Bo'shliqlar va yorliqlarni qo'shishni o'z ichiga olgan o'zgarishlarga e'tibor bermang. |
-B | yangi 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. |
-r | kataloglarni rekursiv ko'rib chiqish. |
-X FILE | nomlari 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 |
KDiff3Git va WinMerge1) 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=$? ) <<<<<<< HEAD
master str
=======
new str
>>>>>>> yangi Bu ikki tomonlama birlashtirish vositasini ochadi: Ta'riflangan mantiqqa asoslanib, biz birlashtirish buyrug'ini qayta yozamiz birlashtirish_cmd quyida bayon qilinganidek: 2) Keling, tahrir qilaylik .gitconfig 3) Ikki filialni birlashtirganda ziddiyat yarataylik (DiffMerge yordamida misolga qarang). Filiallarni birlashtirishda ziddiyatni hal qilish uchun buyruqdan foydalaning |
), 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 |
KDiff3Git va WinMerge1) 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=$? ) <<<<<<< HEAD
master str
=======
new str
>>>>>>> yangi Bu ikki tomonlama birlashtirish vositasini ochadi: Ta'riflangan mantiqqa asoslanib, biz birlashtirish buyrug'ini qayta yozamiz birlashtirish_cmd quyida bayon qilinganidek: 2) Keling, tahrir qilaylik .gitconfig 3) Ikki filialni birlashtirganda ziddiyat yarataylik (DiffMerge yordamida misolga qarang). Filiallarni birlashtirishda ziddiyatni hal qilish uchun buyruqdan foydalaning |
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 meld2-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