localize diretórios que não contenham um arquivo [duplicado]

14

Como posso usar o comando find para localizar diretórios que NÃO contêm um arquivo específico? Por exemplo, se eu tiver vários diretórios que devem estar sob controle de revisão, posso pesquisar e encontrar os que não têm um subdiretório .git ? Ou, meu projeto especifica que todos os módulos devem ter um arquivo utilities.py ; Como faço para procurar quais subdiretórios ainda não possuem o arquivo necessário?

    
por ChrisDR 29.09.2014 / 17:08

1 resposta

14

A solução que pode funcionar para o seu caso é

find . -type d '!' -exec test -e "{}/utilities.py" ';' -print

Teste

  1. 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.
  2. Eu criei os arquivos arquivo1 , arquivo2 , arquivo3 e arquivo4 em dir2 e dir3 .
  3. Em dir1 , criei arquivo1 , arquivo2 , arquivo3 .
  4. Em dir com espaços , criei um arquivo chamado arquivo com espaços .
  5. Agora, executo meu comando find como

    find . -type d '!' -exec test -e "{}/file with spaces" ';' -print
    
  6. A saída que recebo é

    .
    ./dir1
    ./dir2
    ./dir3
    
  7. 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
    
por 29.09.2014 / 17:14

Tags