
Сценарий:
- 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