Директории с файлами — это деревья в терминологии теории графов. Если конечно, там нет жестких ссылок (символические ссылки можно считать особыми текстовыми файлами). А деревья можно, как известно, как минимум, объединять, прививать, умножать и вычитать.
Если с прививанием деревьев всё ясно — mv source_dir dest_dir/dir2/ например или то же самое с cp, то с остальными двумя операциями сложней.
Но кажется, объединять директории с помощью cp -r всё-таки можно:
$ mkdir -p sdir/{1,2,3}/{4,5,6}/{8,9}
xenius@xenote:~$ mkdir -p ddir/{2,3,4}/{5,6,7}
xenius@xenote:~$ cp -r -T sdir ddir
xenius@xenote:~$ tree ddir
ddir
├── 1
│ ├── 4
│ │ ├── 8
│ │ └── 9
│ ├── 5
│ │ ├── 8
│ │ └── 9
│ └── 6
│ ├── 8
│ └── 9
├── 2
│ ├── 4
│ │ ├── 8
│ │ └── 9
│ ├── 5
│ │ ├── 8
│ │ └── 9
│ ├── 6
│ │ ├── 8
│ │ └── 9
│ └── 7
├── 3
│ ├── 4
│ │ ├── 8
│ │ └── 9
│ ├── 5
│ │ ├── 8
│ │ └── 9
│ ├── 6
│ │ ├── 8
│ │ └── 9
│ └── 7
└── 4
├── 5
├── 6
└── 7
36 directories, 0 files
$ rm -rf {s,d}dir
В общем, стандартный инструмент для сложения директорий есть.
А есть ли стандартные инструменты для вычитания директорий?
a) Скопировать в директорию C все те и только те файлы, которые есть в директории A, но которых нет в директории B b) Удалить из директории A все и только те файлы, копии которых есть в директории B Даже два варианта вычитания. И к каждому из них можно добавить критерии проверки: считать идентичными файлы с одинаковыми путями или файлы, которые с одинаковыми путями и одинаковым содержимым. И два варианта вывода результата: в уменьшаемой директории или отдельно.
Кроме того, можно ещё построить пересечение директорий — все файлы, которые есть в обоих директориях и находятся по одному пути. Другой вариант — учитывать и содержимое.
Однако, пересечение директорий можно получить вычетанием: A * B = A - (A - B).
Так вот, существуют ли утилиты, позволяющие выполнять вычитание деревьев директорий или только самому заморачиваться с find, sort comm и md5sum? А то пока приходит в голову только такой пример — с помощью find и exec вывести список файлов совместно с их md5, а потом с помощью comm выбрать пересечение (comm -3) или одно из направлений вычитания (comm -1 или comm -2), но в данном случае возникнут проблемы с нестандартными символами в именах файлов.