ProIT: медіа для профі в IT
3 хв

Лайфхаки: Використання команди comm для порівняння файлів або каталогів у Linux

author avatar ProIT NEWS

Команда comm у системах Linux може порівнювати вміст файлів або каталогів і відображати відмінності у зрозумілий і зручний спосіб. Думайте про «comm» не стільки як про «compare», скільки як про «common», оскільки команда записує у стандартний вивід як рядки, які є загальними, так і рядки, які є унікальними в кожному з файлів або каталогів.

Однією з ключових вимог під час використання comm є те, що вміст, який порівнюється, має бути відсортованим. Однак є способи уникнути порівняння невідсортованого вмісту. Деякі приклади того, як це зробити, наведені у публікації Network World.

Порівняння файлів

Зазвичай, використовуючи команду comm, ви порівнюєте два відсортовані текстові файли, щоб побачити їхні спільні й унікальні рядки. Ось приклад порівняння списку друзів і списку сусідів.

$ comm friends neighbors 
Alice 
Betty 
Christopher 
                                Diane 
George 
                                Patty 
Ricky 
Sam     
                                Tim 
                Zelda

Зверніть увагу, що вихідні дані відображаються у трьох стовпцях. Перший охоплює імена, які включені лише у перший файл. Другий показує імена, які включені лише у другий файл. Третій показує загальні назви.

ПРИМІТКА. Якщо один із файлів не було відсортовано, ви побачите щось подібне до цього:

$ comm friends neighbors
Alice
Betty
Christopher
                Diane
                Patty
comm: file 1 is not in sorted order        <==
George
Ricky
Sam
                Tim
        Zelda
comm: input is not in sorted order         <==

Однак вирішити цю проблему можна, фактично не змінюючи порядок сортування самих файлів. Замість цього ви можете сортувати файли під час виконання команди comm, як у наведеному нижче прикладі:

$ comm <(sort friends) <(sort neighbors)
Alice
Betty
Christopher
                Diane
George
                Patty
Ricky
Sam
                Tim
        Zelda

Якщо ви хочете бачити лише вміст, спільний для порівнюваних файлів, то можете приховати відображення перших двох стовпців за допомогою такої команди:

$ comm -12 friends neighbors
Diane
Patty
Tim

«12» означає «приховати стовпець 1 і стовпець 2». Таким чином можна приховати будь-який зі стовпців.

У наведеній нижче команді приховано лише третій стовпець. У результаті ви побачите імена, які є унікальними для кожного файлу, але не ті, що включені в обидва файли.

$ comm -3 friends neighbors
Alice
Betty
Christopher
George
Ricky
Sam
        Zelda

Якщо ви хочете порівняти файли, які можуть бути не відсортовані, то можете використати параметр --nocheck-order.

$ comm --nocheck-order friends neighbors
Alice
Betty
Christopher
                Diane
George
                Patty
Ricky
Sam
Tim
        Zelda
        Tim

Щоб команда comm підрахувала кількість рядків у кожному стовпці, додайте опцію -- total, як показано нижче.

$ comm --total friends neighbors
Alice
Betty
Christopher
                Diane
George
                Patty
Ricky
Sam
                Tim
        Zelda
6       1       3       total

Щоб використовувати розділові знаки, відмінні від вкладок, які за замовчуванням відокремлюють стовпці, скористайтеся параметром output-delimiter -, як показано у прикладі нижче. Рядки нижче без символів «:» є записами першого стовпця (лише в першому файлі). Ті, що починаються з одного «:», є іменами другого стовпця (лише у другому файлі). Рядки нижче, які починаються з «::», є іменами третього стовпця (містяться в обох файлах). Це може спростити імпорт результатів в електронну таблицю.

$ comm --output-delimiter=: friends neighbors
Alice
Betty
Christopher
::Diane
George
::Patty
Ricky
Sam
::Tim
:Zelda

Порівняння каталогів

Під час порівняння вмісту каталогу вам потрібно використовувати техніку, подібну до тієї, що була показана раніше для порівняння несортованих файлів шляхом сортування їхнього вмісту у процесі порівняння, щоб отримати список файлів. У цьому прикладі вміст двох каталогів перераховується перед порівнянням.

$ comm <(ls dir1) <(ls dir2)
file1
        file2
                file3
                

У наведеному вище прикладі єдиним файлом, який є спільним для обох каталогів, є file3.

Однак зауважте, що щойно показана команда comm порівнює лише імена файлів. Він не порівнює вміст файлу.

Додавання заголовків

Якщо ви хочете додати заголовки стовпців до виводу comm, то можете помістити як команду echo, так і команду comm, яку потрібно виконати, у файл сценарію. Хоча заголовки не обов’язково будуть точно узгоджуватися зі вмістом, який порівнюється, вони все одно можуть бути корисними. Ось приклад сценарію:

#!/bin/bash

echo -e "friends\tneighbors both"
echo "======= ========= ===="
comm friends neighbors

Це приклад виведення зі сценарію:

$ compare
friends neighbors both
======= ========= ====
Alice
Betty
Christopher
                Diane
George
                Patty
Ricky
Sam
                Tim
        Zelda

Команда comm дає змогу досить легко порівнювати вміст текстових файлів, навіть якщо вони не відсортовані спочатку. Це також дозволяє порівнювати імена файлів у двох каталогах.

Читайте інші лайфхаки у ProIT:

Лайфхаки: як увімкнути приховані функції Windows 11 за допомогою Microsoft StagingTool.

Лайфхаки для навігації у файловій системі Linux.

Підписуйтеся на ProIT у Telegram, щоб не пропустити жодну публікацію!

Приєднатися до company logo
Продовжуючи, ти погоджуєшся з умовами Публічної оферти та Політикою конфіденційності.