Encontre diretórios que não contenham um diretório?

3

Estou tentando descobrir como usar o comando "find" do Linux (ou outro comando que executará o trabalho) para retornar uma lista de caminhos / diretórios de arquivos que não contêm um diretório de um determinado nome.

~/web/domain1.com/public_html/bar
~/web/domain2.com/public_html/
~/web/domain3.com/public_html/bar
~/web/domain4.com/public_html/

Eu quero todos os caminhos que não contêm o diretório chamado "bar" (domain2.com e domain4.com). Alguma idéia de como eu posso encontrar para produzir essa lista?

Obrigado!

    
por erikcw 13.03.2010 / 00:36

4 respostas

2
find ~ -type d '!' -exec test -d '{}/bar' ';' -print

... mas isso provavelmente não é exatamente o que você quer; para os diretórios de exemplo que você forneceu, ele mostrará:

/path/to/home
/path/to/home/web
/path/to/home/web/domain1.com
/path/to/home/web/domain1.com/public_html/bar
/path/to/home/web/domain2.com
/path/to/home/web/domain2.com/public_html
/path/to/home/web/domain3.com
/path/to/home/web/domain3.com/public_html/bar
/path/to/home/web/domain4.com
/path/to/home/web/domain4.com/public_html

i.e. ele lista o diretório every que não contém um subdiretório "bar", incluindo os próprios diretórios "bar" (a menos que contenham seus próprios subdiretórios de barras ...). Você provavelmente deseja adicionar uma restrição adicional, como listar apenas diretórios em uma determinada profundidade:

find ~ -type d -depth 3 '!' -exec test -d '{}/bar' ';' -print

ou com um certo nome:

find ~ -type d -name public_html '!' -exec test -d '{}/bar' ';' -print

... ambos imprimem:

/path/to/home/web/domain2.com/public_html
/path/to/home/web/domain4.com/public_html
    
por 13.03.2010 / 20:23
1

Eu não sei usar o find, mas isso funciona:

justin@media:/tmp/sf$ for x in *;do [ -e $x/public_html/bar ] || echo $x;done
domain2.com
domain4.com
    
por 13.03.2010 / 00:53
1

Por que não usar o grep?

editado:

find . -type d | grep -v "bar"

Isto listará todos os diretórios, o grep lerá a entrada padrão e então fará uma correspondência inversa na string "bar"

    
por 13.03.2010 / 00:43
1

Se você quiser corresponder exatamente esses diretórios e não qualquer instância de bar / então um comando como este funcionaria.

find . \! -wholename '*/web/domain1.com/public_html/bar/*' \
       \! -wholename '*/web/domain1.com/public_html/bar/'  \
       \! -wholename '*/web/domain3.com/public_html/bar/*' \
       \! -wholename '*/web/domain3.com/public_html/bar/'

Se você quiser ignorar a barra / diretório onde cada um é encontrado, então você provavelmente iria querer algo assim.

find . \! -wholename '*/bar/*' \! -wholename '*/bar/'
    
por 13.03.2010 / 02:10