O processamento de Arg em um script para uma função “find” modificada?

3

Estou usando o FreeBSD e entendo e uso a opção -prune em find para evitar que o comando desça para um subdiretório. Mas acho a sintaxe necessária muito desajeitada e desajeitada. Ele também não impede que a própria pasta aparada apareça, que pode ser consertada, mas é irritante.

Gostaria de criar um script / alias curto que tenha o efeito de adicionar um novo -noenter arg ao comando find se for dado antes de quaisquer outros primários (para simplificar) .

O objetivo é que eu possa digitar:

  • find -xs /dir -noenter '$*' -name '*.conf' -ls
  • find -x -s /dir -noenter '$*' -name '*.conf' -ls

e ele converterá os argumentos e executará:

  • /usr/bin/find -xs /dir \( -name '$*' -prune -or \( -name '*.conf' -and ! \( -type d -and -name '$*' \) \) \) -ls
  • /usr/bin/find -x -s /dir \( SNIPPED \) -ls

mas também posso digitar normalmente qualquer comando de rotina "find" e passá-lo de forma transparente para /usr//bin/find para executar.

Logicamente, o script precisa identificar o primeiro argumento após o nome do dir e, em seguida, testar se ele é:

  • ... igual a -noenter e seguido por pelo menos mais 2 args (nesse caso eu sei como construir o arg eu preciso passar para /usr/bin/find sabendo quais args eram antes / depois dele); ou
  • ... igual a -noenter mas não seguido por pelo menos mais 2 args (= erro); ou
  • ... qualquer outra coisa ou dir foi o último argumento ou não foi encontrado (= passa argumentos originais inteiros para /usr/bin/find inalterado).

Eu posso fazer tudo isso, exceto uma coisa - como faço para codificar a parte do script que examina a argv para dizer qual número arg (se houver) é o argumento dir ?

Minha opção de shell é sh para script.

    
por Stilez 02.04.2018 / 18:41

1 resposta

1

Se o que você quer é testar a existência e a localização de um argumento específico, tudo o que você precisa fazer é analisar a linha de comando e testar cada argumento para uma correspondência com o valor "esperado". Portanto, você precisa testar cada argumento para o valor -noenter e, em seguida, imprimir uma linha informando a posição e o nome da variável -noenter :

for i in 'seq 1 $#'; do
    ref='eval "echo \$$i"'
    if [ $ref == '-noenter' ]; then echo "arg $i is $ref"; break; fi
done

Agora, a mesma coisa, somente a posição do argumento -noenter é armazenada em $mitsos e a posição do argumento antes disso em $mary :

for i in 'seq 1 $#'; do
  ref='eval "echo \${$i}"'
  if [ $ref == '-noenter' ]; then
    mitsos=$i
    eva=$(($i-1))
    mary='eval "echo \${$eva}"'
    break
  fi
done

e agora $mitsos tem a posição de -noenter ou nenhum valor e $mary o valor do argumento anterior a -noenter . Neste ponto, se $mary tiver o valor /dir você sabe , o próximo argumento será -noenter e você poderá continuar com a implementação de find , caso contrário, use a versão ou impressão do sistema uma mensagem de erro. Finalmente, se você não se importa com a posição de -noenter , você pode omitir a linha mitsos=$i .

    
por 04.04.2018 / 10:53