Возможно, можно использовать rsync в качестве приема, чтобы сделать это.
rsync --dry-run --delete --recursive --verbose dir1/ dir2
или, короткая версия
rsync -nrv --delete dir1/ dir2
Не ЗАБЫВАЙТЕ - пробный прогон ИЛИ-n ОПЦИЯ, или целевой каталог (dir2) будет идентичен исходному каталогу (dir1).
Этот будет ouput различия двух каталогов, и включая имена каталогов и включая содержание файла и имена файлов. (и можно даже сравнить 2 каталога в 2 различных машинах),
sending incremental file list
deleting dir3-1/ # this directory (name) doesn't exist in source directory
deleting file2.txt # this file (name) doesn't exist in source directory
file1.txt # this file is different (content) from the source files
dir3/ # this directory (name) doesn't exist in destination directory
sent 95 bytes received 21 bytes 232.00 bytes/sec
total size is 4 speedup is 0.03 (DRY RUN)
Для различия в папках можно попробовать
ls -R fold1 > list1
ls -R fold2 > list2
diff list1 list2.
Кому: diff
файлы, однако, я думаю, что необходимо будет записать, сценарий (возможно, анализируют ls-R вывод).
Несколько hackish решение:
find fold1 -type f|while read x; do [ -e fold2/$x ] && diff fold1/$x fold2/$x >> files_diff.out; done
Это не может быть самым изящным или эффективным способом сделать это, все же. Я уверен, что кто-то более сведущий в Bash может придумать лучший путь. Если бы Вы являетесь грамотными в Perl, я предложил бы использовать его модуль File::Find.