На первый взгляд, сравнение двух каталогов в системе Linux может показаться довольно простой задачей. Но, на самом деле, все не так просто. Такая процедура требует глубоких знаний в управлении файлов в Linux.
Например, у вас имеются два каталога с похожим содержимым. Вы хотите избавиться от одного из них, но вы не уверены, являются ли они дубликатами. Так как два каталога с одинаковой структурой подкаталогов, содержащих одинаковые имена файлов, не делают их идентичными. Например, размеры содержащихся в них файлов могут отличаться. Или даже размеры могут совпадать, но содержимое быть отличным.
В этой статье, постараемся познакомиться с правильным подходом к сравнению двух каталогов в операционной системе Linux.
Задача.
Имеются два каталога dir1 и dir2, с похожей структурой. Эти каталоги содержат некоторые файлы и подкаталоги.
Для понимания того, какая точная структура каталога, воспользуемся командой tree
$ tree dir1 dir1 ├── final_file.txt ├── newer.txt ├── sample_file.txt ├── subdir1 │ ├── file11 │ └── file12 ├── subdir2 │ ├── file21 │ └── file22 ├── subdir3 │ ├── file31 │ └── file32 └── to_be_copied.txt 3 directories, 10 files
$ tree dir2 dir2 ├── final_file.txt ├── new.txt ├── sample_file.txt ├── subdir1 │ ├── file11 │ └── file12 ├── subdir2 │ ├── file21 │ ├── file22 │ └── file23 └── to_be_copied.txt 2 directories, 9 files
На первый взгляд, видно, что эти каталоги отличаются как минимум, подкаталогом subdir3, но давайте рассмотрим более эффективный способ сравнения.
Сравнение каталогов с помощью команды diff.
Основной задачей команды diff , является построчное сравнение двух файлов. Синтаксис ее использования выглядит следующим образом:
$ diff [OPTION]... FILES
Эта команда, по умолчанию, установлена во всех дистрибутивах Linux, поэтому дополнительных телодвижений с менеджерами пакетов не требуется.
Опираясь на утверждение, что в Linux все есть файл, и даже каталоги, то ничего нам не помешает сравнить их с помощью diff. Команда для сравнения каталогов будет выглядеть примерно так:
$ diff -q /path/to/directory1 /path/to/directory2
Сравнение каталогов на первом уровне.
Чтобы реализовать приведенную выше команду в пользу двух наших каталогов, подставим в предыдущую команду наши данные, окончательная реализация команды diff будет выглядеть следующим образом:
$ diff -q dir1 dir2
Параметр команды -q сообщит нам о различии в файлах в этих каталогах.
Так же обратите внимание, что мы реализуем команду diff на уровне каталога, поэтому нет необходимости вводить абсолютные пути к каталогам dir1 и dir2.
$ diff -q dir1 dir2 Only in dir1: newer.txt Only in dir2: new.txt Common subdirectories: dir1/subdir1 and dir2/subdir1 Common subdirectories: dir1/subdir2 and dir2/subdir2 Only in dir1: subdir3
Согласно приведенному выше выводу, команда diff анализирует различия и общие черты в двух каталогах. При этом содержимое подкаталогов не анализируется.
Сравнение файлов на всех уровнях каталога.
Вывод команды выше не анализирует содержимое подкаталогов. Чтобы команда diff прошлась и по ним, нужно включить параметр команды -r, тогда вводимая команда проанализирует рекурсивно все файлы и подкаталоги.
$ diff -qr dir1 dir2 Only in dir1: newer.txt Only in dir2: new.txt Only in dir2/subdir2: file23 Only in dir1: subdir3
Изменение команды diff обеспечило полное сравнительное представление файлов и файлов в подкаталогах ранее созданных каталогов.
Если вы хотите, чтобы команда diff также сообщала об идентичных файлах на всех уровнях каталога, такая реализация команды diff будет выглядеть следующим образом:
$ diff -qrs dir1 dir2 Files dir1/final_file.txt and dir2/final_file.txt are identical Only in dir1: newer.txt Only in dir2: new.txt Files dir1/sample_file.txt and dir2/sample_file.txt are identical Files dir1/subdir1/file11 and dir2/subdir1/file11 are identical Files dir1/subdir1/file12 and dir2/subdir1/file12 are identical Files dir1/subdir2/file21 and dir2/subdir2/file21 are identical Files dir1/subdir2/file22 and dir2/subdir2/file22 are identical Only in dir2/subdir2: file23 Only in dir1: subdir3 Files dir1/to_be_copied.txt and dir2/to_be_copied.txt are identical
Заключение.
В этой статье, мы видим насколько эффективна команда diff при сравнении двух каталогов в среде ОС Linux. Очень надеюсь, что данное знание пригодится вам в будущем.
А если вам понравилась статья, то вы можете оставить комментарий ниже.
Was this helpful?
0 / 0