{ find . -type f -name "*.ext1" -printf "%h\n" | sort -u; find . -type f -name "*.ext2" -printf "%h\n" | sort -u; } | sort | uniq -d
Объяснение:
find ... -printf "%h\n"
печатает каталоги, содержащие файлы, которые совпадают;sort -u
удаляет дубликаты;- есть
find ... | sort -u
труба для каждого из двух расширений; - финал
sort | uniq -d
печатает строки, которые появляются более одного раза; путь к каталогу будет появляться более одного раза, если он будет возвращен каждымfind ... | sort -u
.
Есть как минимум две проблемы:
-printf
это не POSIX. Переносимый вариант команды может быть:{ find . -type f -name "*.ext1" | xargs -L 1 dirname | sort -u; find . -type f -name "*.ext2" | xargs -L 1 dirname | sort -u; } | sort | uniq -d
xargs
будет жаловаться, еслиfind
ничего не найдет; это не должно нарушать логику, хотя.Новые строки в именах каталогов нарушают логику. Они могут генерировать ложные срабатывания, сделать вывод неоднозначным. Инструменты, расширенные за пределы своего минимума POSIX, могут поддерживать опции, которые позволяют вам анализировать строки с нулевым символом в конце. Это работает в моем Debian:
{ find . -type f -name "*.ext1" -printf "%h\0" | sort -u; find . -type f -name "*.ext2" -printf "%h\0" | sort -z -u; } | sort -z | uniq -z -d
Чтобы получить более удобный для восприятия формат, отправьте его по адресу
tr '\0' '\n'
. Новые строки из имен каталогов по-прежнему будут вызывать неоднозначность, но по крайней мере несколько строк из одного имени каталога будут появляться последовательно, как вы, безусловно, этого хотите.