Regextype 'find' permanentemente configurado

2

O GNU find permite o uso de diferentes formatos regex através da opção -regextype , mas tanto quanto eu posso diga que tenho que digitar -regextype <whatever> todas as vezes que é oneroso.

Se alguém quiser um sabor diferente de regex, as chances são de que sempre queremos, em vez de mudar o tipo usado com todos os comandos. O ideal seria definir o sabor de regex preferencial por meio de um arquivo de preferência ( ~/.find_profile ) ou variável de ambiente ( $FIND_OPTS ), mas não encontrei nenhuma indicação de que isso seja possível.

Como posso definir regextype permanentemente?

    
por blahdiblah 28.10.2013 / 23:59

4 respostas

2

Eu não fiz muitos testes disso, mas parece funcionar. Ele desmonta a lista de argumentos em find e concatena os argumentos de volta em outra lista de argumentos, mas insere -regextype posix-awk na frente de qualquer argumento -iregex ou -regex que encontrar.

Manipular a lista de argumentos no shell desta forma, às vezes, não consegue lidar com certas construções de cotação corretamente, mas deve funcionar bem na maioria dos casos.

Basta colocar essa função no seu arquivo ~/.bashrc ou no arquivo rc do shell que você executa.

find ()
{
    args=
    for arg in $*
    do
        case $arg in
            -iregex|-regex)
                args="$args -regextype posix-awk $arg"
                ;;
            *)
                args="$args $arg"
                ;;
        esac
    done
    set -f
    command find $args
    set +f
}
    
por 29.10.2013 / 00:56
0

Usar um alias para find permite definir o regextype automaticamente, mas limita a outra sintaxe disponível :

alias find='find -regextype <whatever>'

O problema é que muitos argumentos opcionais para localizar agora não podem ser usados, porque -regextype deve fazer parte do [expression] block do comando de localização:

find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]

Com o alias acima, a tentativa de usar as opções de link simbólico, depuração e otimização dá o erro: find: unknown predicate '-<whatever>' como especificar um caminho: find: paths must precede expression: <wherever> . Todas essas opções são opcionais, por isso, o recurso ainda funciona, mas é mais limitado.

    
por 28.10.2013 / 23:59
0

Outra opção é um script wrapper encontrado a la este script perl explicitamente para definindo -regextype .

A desvantagem desta solução é que ela está mais envolvida e um pouco frágil. O script vinculado não lida com -D , por exemplo.

    
por 29.10.2013 / 00:01
0

Esta resposta deve ser bastante segura em relação ao espaço em branco. Mas talvez seja bash -específico?

Insere -regextype posix-extended na frente do primeiro -iregex ou -regex . Salve isso em algum lugar no seu $PATH . E, se você salvar isso como find , certifique-se de editar a última linha ( find "$@" ), caso contrário, ela irá se chamar em um loop infinito

#!/bin/bash
for ((i=1; i<= $#; ++i )) {
    if [[ "-iregex" = "${@:i:1}" ]]; then
        set -- "${@:1:i-1}" "-regextype" "posix-extended" "${@:i}"
        break
    fi
    if [[  "-regex" = "${@:i:1}" ]]; then
        set -- "${@:1:i-1}" "-regextype" "posix-extended" "${@:i}"
        break
    fi
    if [[ "--" = "${@:i:1}" ]]; then
        break
    fi
}
find "$@"

Aprendi sobre set -- , como um método para editar os argumentos da linha de comando, aqui: de: link

Por exemplo, se o quarto argumento for -regex , i será 4 e o novo conjunto de argumentos da linha de comando deverá ser:

  • os três primeiros argumentos originais: "${@:1:i-1}"
  • ... seguido por dois novos argumentos: -regextype e posix-extended
  • ... seguido pelo quarto e subsequentes argumentos: "${@:i}"
por 30.06.2016 / 15:16