Como encontrar as mesmas subpastas em duas pastas apenas no primeiro nível?

Como encontrar as mesmas subpastas em duas pastas apenas no primeiro nível?

Cenário:

  • 2 pastas principais, que podem ter subpastas com os mesmos nomes (não sei quais nomes podem estar duplicados, é isso que estou tentando encontrar)
  • as subpastas têm MUITOS outros arquivos e subpastas, então ferramentas com recursão automática não são realmente uma opção
  • Eu só me importo com nomes de subpastas duplicados no primeiro nível das duas pastas principais
  • o conteúdo das subpastas não importa
  • o conteúdo dos arquivos não importa

Tentei usar melda GUI, mas isso leva um tempo infinito para terminar essas estruturas.

Tentei usar diff --brief --report-identical-files folder1 folder2mas isso basicamente reporta tudo e nem inclui as pastas então não consigo nem | grep identical.

Estou usando ferramentas erradas? Ou há algum truque que eu não aprendi diff --help? Ou estou fazendo algo errado?

Obrigado

Responder1

Eu usaria um simples find:

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

Ou para ter terminação zero para evitar problemas com caracteres de nova linha:

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

Responder2

Usando zsh, dado

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

6 directories, 0 files

então

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

cria matrizes dotails (nomes de base) de diretórios /nos dois diretórios de nível superior dir1e dir2(comDotglob eNopções ullglob habilitadas).

Então podemos usar uma expansão do formulário ${name:*arrayname}para reter apenas os elementos que estão presentes em ambos os arrays:

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

informação relacionada