Как различить два каталога в Linux.

На первый взгляд, сравнение двух каталогов в системе 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

Добавить комментарий 0