find comando com padrão múltiplo não retornando nenhuma saída

0
#!/bin/bash
pat="'*.ab' -o -name '*.bc'"
open="\("
close="\)"
path=path

find $path -type f $open -name $pat $close

O código acima não mostra nenhuma saída para encontrar. Ajude

    
por Arjun 19.06.2017 / 10:41

3 respostas

2
pat="'*.ab' -o -name '*.bc'"
find $path -type f $open -name $pat $close

Isso não faz o que você deseja: as aspas dentro da variável pat não são consideradas aspas, mas sim caracteres literais. Depois que $pat for expandido, será o wordsplit, resultando nas palavras '*.ab' , -o , -name e '*.bc' , com aspas simples ainda intactas. Então, a menos que você tenha nomes de arquivos com aspas simples dentro deles, isso não corresponderá.

path=path

Isso define a variável path como a string literal path , mas suponho que esse seja apenas um espaço reservado.

open="\("
close="\)"

Eles colocam barras invertidas literais nas variáveis e find provavelmente deve reclamar, pois recebe um argumento de \( . Basta citar os parênteses uma vez, então open="(" ou open=\(

Se você precisar criar uma lista de expressões para find , use um shell com matrizes (Bash ou quase qualquer coisa, exceto sh ):

args=()  
args+=( -name "*.ab" )
args+=( -or -name "*.bc" ) 

find ... \( "${args[@]}" \)

Quebra a construção da matriz em um loop, conforme necessário.

    
por 19.06.2017 / 11:04
2

Você está usando o tipo errado de variável e esquecendo de citá-los.

Aqui, você precisa de um array para armazenar mais de um argumento:

#! /bin/bash -
pat=('*.ab' -o -name '*.bc')
open='('
close=')'
path=path

find "$path" -type f "$open" -name "${pat[@]}" "$close"

Observe que é um argumento *.ab e ( que você deseja passar para find , não '*.ab' ou \( . Essas citações e barras invertidas fazem parte da sintaxe do shell.

Isso é somente se você quisesse criar uma linha de comando do shell, por exemplo, para passar para eval para o shell avaliar que você faria:

#! /bin/bash -
pat="'*.ab' -o -name '*.bc'"
open="\("
close="\)"
path=path

eval 'find "$path" -type f '"$open -name $pat $close"

Para o shell avaliar:

find "$path" -type f \( -name '*.ab' -o -name '*.bc \)

O que acima resulta em find sendo chamado com estes argumentos:

  • find
  • path (conteúdo de $path )
  • -type
  • f
  • (
  • *.ab
  • -o
  • -name
  • *.bc
  • )
por 19.06.2017 / 11:02
0

Use uma abordagem simples (em vez de brincar com variáveis):

find $path -type f -name "*.ab" -o \( -name "*.bc" \)
    
por 19.06.2017 / 10:57