Estou usando o FreeBSD e entendo e uso a -prune
opção on find
para evitar que o comando desça para um subdiretório. Mas acho a sintaxe necessária muito desajeitada e estranha. Também não impede que o próprio diretório removido apareça, o que pode ser corrigido, mas irritante.
Eu gostaria de criar um pequeno script/alias que tenha o efeito de adicionar um novo -noenter
argumento ao find
comandoseé fornecido antes de qualquer outra primária (para simplificar).
O objetivo é que eu possa digitar qualquer um dos seguintes:
find -xs /dir -noenter '$*' -name '*.conf' -ls
find -x -s /dir -noenter '$*' -name '*.conf' -ls
e 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 ele será transmitido de forma transparente para /usr//bin/find
execução.
Logicamente, o script precisa identificar o primeiro argumento após o nome do diretório e depois testar se é:
- ... igual
-noenter
e seguido por pelo menos mais 2 argumentos (nesse caso eu sei como construir o argumento que preciso passar/usr/bin/find
sabendo quais argumentos estavam antes/depois dele);ou - ... igual,
-noenter
mas não seguido por pelo menos mais 2 argumentos (= erro);ou - ...qualquer outra coisa ou dir foi o último argumento ou não foi encontrado (= passar argumentos originais inteiros para
/usr/bin/find
inalterados).
Posso fazer tudo isso, exceto uma coisa: como codifico a parte do script que examina argv para saber qual número de argumento (se houver) é o dir
argumento?
Minha escolha de shell é sh
para scripts.
Responder1
Se o que você deseja é testar a existência e 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 seu valor "esperado". Então, você precisa testar cada argumento para o valor -noenter
e então 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, apenas a posição do argumento -noenter
é armazenada $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 -noenter
. Neste ponto, if $mary
tem o valor /dir
que vocêsabero próximo argumento é -noenter
e você pode continuar com sua implementação find
, caso contrário você usará a versão do sistema ou imprimirá uma mensagem de erro. Finalmente, se você não se importa com a posição de -noenter
você pode omitir a linha mitsos=$i
.