Иногда необходимо сравнить 2 директории с достаточно большим количеством файлов на предмет наличия или отсутствия файлов, не анализируя их содержимое. В принципе для такой задачи в *nix существует утилита diff, впрочем с одним «но» — анализируется содержимое файлов и вывод несколько «избыточен». Представьте, что необходимо сравнить файловые системы jail с количеством файлов примерно 100 000. Мы, естественно, пойдем другим путем. В настоящей системе существуют еще 2 утилиты: find и comm.

Вначале создаем списки файлов:

# /home/myuser/olddir
# find . -type f -print | sort > /home/myuser/old.txt
# /home/myuser/newdir
# find . -type f -print | sort > /home/myuser/new.txt

Список создается рекурсивно. Далее сравниваем списки:

# comm -3 /home/myuser/old.txt /home/myuser/new.txt > /home/myuser/old/diff.txt

Получаем список, в котором файлы, присутствующие только в директории /home/myuser/olddir записаны без отступа, а файлы, присутствующие только в директории /home/myuser/newdir записаны с двумя символами табуляции в начале строки. Далее полученный список можно обрабатывать так, как вам угодно.

Характерно, что весь процесс для директорий с количеством файлов примерно 50 000 занимает несколько секунд, сравните, для интереса, в работой diff.