
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 meld
a GUI, mas isso leva um tempo infinito para terminar essas estruturas.
Tentei usar diff --brief --report-identical-files folder1 folder2
mas 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 dir1
e 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