o caminho do prune de find não está tomando curingas

0

Eu quero excluir um diretório da árvore de pesquisa de localização. .aaa é um subdiretório oculto no diretório atual. Desejo excluir aaa_rc_bbb, xxx_rc_xxx e muitos mais subdiretórios contendo rc em seus nomes. Mas ainda não está ignorando e me dando resultados contendo os subdiretórios rc . É como se *rc* curinga não estivesse funcionando.

find -L /students/projects/myname/ -name .aaa -prune -o -path */*/class_project/*/*/pikachu/*/*/*rc*/ -prune -o -path */*/class_project/*/*/pikachu/*/*/bambi/b‌​ambi.txt | head -n50 | xargs ls .

Além disso, quero encontrar para pesquisar apenas neste caminho: */*/class_project/*/*/pikachu/*/*/bambi/b‌​ambi.txt

Por favor me ajude. Estou fazendo algo errado?

    
por Pompy 27.12.2017 / 11:49

2 respostas

2

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/b‌​ambi.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/b‌​ambi.txt' \) -prune \
    -o -print
    
por 27.12.2017 / 12:09
0

Seu padrão -path termina com uma barra. Nenhum nome de caminho que find examina terminará em uma barra, portanto, o padrão nunca corresponderá a nada.

Para remover qualquer diretório chamado .aaa e qualquer diretório com rc em seu nome:

find -L /students/projects/myname \
    -type d '(' -name '.aaa' -o -name '*rc*' ')' -prune -o -print

Para ver apenas o caminho */*/class_project/*/*/pikachu/*/*/bambi/b‌​ambi.txt :

find -L /students/projects/myname \
    -type d '(' -name '.aaa' -o -name '*rc*' ')' -prune -o \
    -path '*/*/class_project/*/*/pikachu/*/*/bambi/b‌​ambi.txt' -print

Isso pressupõe que bambi.txt esteja localizado em

/students/projects/myname/*/*/class_project/*/*/pikachu/*/*/bambi/b‌​ambi.txt

Observe as citações dos padrões no comando find . Sem as aspas, o shell tentaria expandir os padrões para listas de nomes de caminho antes de chamar find , possivelmente resultando em confundir find ou, com alguns shells, um erro.

    
por 23.06.2018 / 13:25

Tags