A solução que pode funcionar para o seu caso é
find . -type d '!' -exec test -e "{}/utilities.py" ';' -print
Teste
- Eu criei 4 subdiretórios chamados dir1 , dir2 , dir3 e dir com espaços . Eu queria testar se isso lida com espaços igualmente, e é por isso que criei um diretório com espaços em seu nome.
- Eu criei os arquivos arquivo1 , arquivo2 , arquivo3 e arquivo4 em dir2 e dir3 .
- Em dir1 , criei arquivo1 , arquivo2 , arquivo3 .
- Em dir com espaços , criei um arquivo chamado arquivo com espaços .
-
Agora, executo meu comando find como
find . -type d '!' -exec test -e "{}/file with spaces" ';' -print
-
A saída que recebo é
. ./dir1 ./dir2 ./dir3
-
Como esperado, como o diretório dir com espaços contém o arquivo chamado arquivo com espaços ele não está listado na saída. Se eu altere o comando
find
para ter arquivo4 , a saída que obtenho é,. ./dir with spaces ./dir1
EDITAR
No entanto, a abordagem acima não parece funcionar se tivermos subdiretórios aninhados e o arquivo no nível final. Então, para superar esses cenários, você pode modificar sua descoberta para algo como discutido em aqui .
find . -type f -not -name 'utilities.py' -exec dirname {} \; | sort -u
Como Gilles sugere em seus comentários ,
For
.git
, it would be more useful to skip directories that have a parent containing.git
. You can do this by adding a -prune in the right place:find . -type d -exec test -e "{}/.git" ';' -prune -o -print