Existem várias maneiras de conseguir isso com encontrar .
A abordagem 1 é menos hacky e funciona bem com nomes de diretórios estranhos (por exemplo, nomes de diretórios contendo novas linhas), mas a abordagem 2 deve ser mais rápida se houver muitos diretórios.
Abordagem 1
Comando
find DIR -type d -mindepth 1 -maxdepth 1 -not -exec test -f {}/FILENAME \; \
-print | sort
Como funciona
-
find DIR -type d -mindepth 1 -maxdepth 1
localiza todos os diretórios (-type d
) em DIR , com profundidade 1. -
-not -exec test -f {}/FILENAME \;
é verdadeiro se e somente se um arquivo chamado FILENAME não puder ser encontrado no diretório atualmente processado ({}
). -
-print
produzirá os nomes de diretório desejados. -
Se desejar,
sort
classificará a saída em ordem alfabética.
Abordagem 2
Comando
( find DIR -type f -mindepth 2 -maxdepth 2 -name FILENAME -printf "%h\n" ; \
find DIR -type d -mindepth 1 -maxdepth 1 ) | sort | uniq -u
Como funciona
-
find DIR -type f -mindepth 2 -maxdepth 2 -name FILENAME
encontra todos os arquivos (-type f
) chamados FILENAME nos subdiretórios de DIR (arquivos de diretórios de profundidade 1 têm profundidade 2). -
-print "%h\n"
imprime os nomes dos diretórios que contêm arquivos nomeados FILENAME , seguidos por uma nova linha. -
find DIR -type d -mindepth 1 -maxdepth 1
lista todos os diretórios (-type d
) em DIR , com profundidade 1. -
sort
classifica a saída em ordem alfabética (a saída deve ser classificada quando o piping foruniq
). -
uniq -u
imprime apenas linhas exclusivas.Todo subdiretório DIR é listado pelo menos uma vez, mas aqueles que contêm um arquivo chamado FILENAME são listados duas vezes.
uniq -u
elimina o último tipo.