A primeira questão é que você tem globs sem aspas ( *
). Todos esses caminhos devem estar entre aspas simples, por ex. %código%. Isso impede que o shell expanda os curingas antes de serem passados para '*/*/class_project/*/*/pikachu/*/*/bambi/bambi.txt'
.
Em seguida, você precisa que a sub-expressão find
ocorra antes da subexpressão da pesquisa principal. BTW, você pode combinar todos os nomes em uma expressão composta com um único -prune
como este:
find \( \( -name '*foo*' -o -name '*bar*' \) -a -prune \) -o \( -name baz -a -print \)
Isso significa que eu quero encontrar arquivos com o nome -prune
, excluindo todos os arquivos / diretórios que contenham baz
ou foo
em seus nomes.
Algumas notas:
- Estou sendo liberal com o operador
bar
(AND) e os parênteses para que não haja ambigüidade. - Os parênteses, que agem para alterar a precedência como na maioria dos outros tipos de expressões, são escapados com
-a
, portanto, não são interpretados pelo shell antes de serem transmitidos para\
. - Estou usando dois testes
find
, mas qualquer outro teste (por exemplo,-name
) pode estar no primeiro conjunto aninhado de parênteses. Qualquer arquivo / dir correspondente a qualquer um dos testes será removido e, portanto, não será aplicado aos próximos testes (no último conjunto de parentes). - É uma boa ideia ser explícito com a ação
-path
para diferenciá-la da parte-print
.
Para maior clareza, vamos reescrever isso em um estilo de expressão mais comum:
((name=='*foo*' OR name=='*bar*') AND prune) OR (name==bar AND print)
ou até mesmo
if (name=='*foo*' OR name=='*bar*')
prune
else if (name==bar)
print
fi
Agora, dadas as regras de precedência normais e o operador booleano padrão é -prune
, podemos reduzir o exemplo para:
find \( -name '*foo*' -o -name '*bar*' \) -prune -o -name baz -print
Se você estiver lendo o seu intento corretamente, você não terá nenhum teste para a segunda sub-expressão, ou seja, se um arquivo não for removido, você poderá imprimi-lo. Então isso leva a
find -L /students/projects/myname/ \( -name .aaa -o -path '*/*/class_project/*/*/pikachu/*/*/*rc*/' \
-o -path '*/*/class_project/*/*/pikachu/*/*/bambi/bambi.txt' \) -prune \
-o -print