find -type d -iname .git -not -iname old
Isso corresponde aos diretórios que são chamados de .git e não são chamados de old . Como um diretório chamado .git não pode ser chamado de old , a parte -not -iname old pode ser removida sem alterar o significado do comando.
-not diz "não combina", mas não "não recorre". Há uma maneira diferente de dizer "não recorrer": é uma ação chamada -prune . O comando a seguir significa "percorrer todos os diretórios recursivamente ( find ), mas parar em diretórios chamados old ( -iname old -prune ) e imprimir diretórios chamados .git ":
find -iname old -prune -o -type d -iname .git -print
Isso é analisado como ( -iname old -prune ) -o ( -type d -iname .git -print ) . Localizar é solicitado a procurar arquivos que atendam às condições -iname old ou ( -o ) -type d -iname .git . Quando um arquivo atende à primeira condição, a ação -prune (remoção da árvore percorrida, ou seja, não recurse) é executada. Quando um arquivo atende à segunda condição, a ação -print é executada. Como a impressão é a ação padrão, você pode omitir -print .