Как найти одинаковые подпапки в двух папках только на первом уровне?

Как найти одинаковые подпапки в двух папках только на первом уровне?

Сценарий:

  • 2 основные папки, которые могут иметь подпапки с такими же именами (я не знаю, какие имена могут дублироваться, это то, что я пытаюсь найти)
  • в подпапках есть МНОГО других файлов и подпапок, поэтому инструменты с автоматической рекурсией на самом деле не вариант
  • Меня интересуют только дублирующиеся имена подпапок на первом уровне двух основных папок.
  • содержимое подпапок не имеет значения
  • содержимое файлов не имеет значения

Я пробовал использовать meldграфический интерфейс, но для завершения этих структур требуется бесконечно много времени.

Я пробовал использовать diff --brief --report-identical-files folder1 folder2, но он в основном сообщает обо всем и даже не включает папки, так что я даже не могу | grep identical.

Я использую неправильные инструменты? Или есть какой-то трюк, который я не понял diff --help? Или я что-то делаю не так?

Спасибо

решение1

Я бы использовал простое find:

find "/path/to/main1" "/path/to/main2" -mindepth 1 -maxdepth 1 -type d -printf '%f\n' | sort | uniq -d

Или сделать его завершающимся нулем, чтобы избежать проблем с символами новой строки:

find "/path/to/main1" "/path/to/main2" -mindepth 1 -maxdepth 1  -type d -printf '%f\0' | sort -z | uniq -zd | xargs -0

решение2

Используя zsh, учитывая

% tree dir1 dir2
dir1
├── bar
└── foo
    └── baz
dir2
├── bar
│   └── baz
└── baz

6 directories, 0 files

затем

% a=( dir1/*(/ND:t) ) ; b=( dir2/*(/ND:t) )

создает массивытails (базовые имена) каталогов /в двух каталогах верхнего уровня dir1и dir2Дотглоб иН(опции ullglob включены).

Затем мы можем использовать расширение формы, ${name:*arrayname}чтобы сохранить только элементы, присутствующие в обоих массивах:

% print -rC1 ${a:*b}
bar

Связанный контент