Estoy usando FreeBSD y entiendo y uso la -prune
opción find
para evitar que el comando descienda a un subdirectorio. Pero la sintaxis necesaria me parece muy torpe e incómoda. Tampoco evita que aparezca el directorio eliminado, lo cual se puede arreglar pero es molesto.
Me gustaría crear un script/alias breve que tenga el efecto de agregar un nuevo -noenter
argumento al find
comando.sise da antes de cualquier otra primaria (por simplicidad).
El objetivo es que pueda escribir cualquiera de:
find -xs /dir -noenter '$*' -name '*.conf' -ls
find -x -s /dir -noenter '$*' -name '*.conf' -ls
y convertirá los argumentos y ejecutará:
/usr/bin/find -xs /dir \( -name '$*' -prune -or \( -name '*.conf' -and ! \( -type d -and -name '$*' \) \) \) -ls
/usr/bin/find -x -s /dir \( SNIPPED \) -ls
pero también puedo escribir normalmente cualquier comando de "buscar" de rutina y lo pasará de forma transparente para /usr//bin/find
ejecutarlo.
Lógicamente, el script necesita identificar el primer argumento después del nombre del directorio y luego probar si es:
- ... igual
-noenter
y seguido de al menos 2 argumentos más (en cuyo caso sé cómo construir el argumento al que necesito pasar/usr/bin/find
sabiendo qué argumentos estaban antes/después de él);o - ... igual
-noenter
pero no seguido de al menos 2 argumentos más (= error);o - ... cualquier otra cosa o directorio fue el último argumento o no se encontró (= pasar los argumentos originales completos a
/usr/bin/find
sin modificaciones).
Puedo hacer todo esto excepto una cosa: ¿cómo codifico la parte del script que examina argv para saber qué número de argumento (si lo hay) es el dir
argumento?
Mi elección de shell es sh
para secuencias de comandos.
Respuesta1
Si lo que desea es probar la existencia y ubicación de un argumento específico, todo lo que necesita hacer es analizar la línea de comando y probar cada argumento para ver si coincide con su valor "esperado". Por lo tanto, debe probar el valor de cada argumento -noenter
y luego imprimir una línea que indique la posición y el nombre de la variable -noenter
:
for i in `seq 1 $#`; do
ref=`eval "echo \\$$i"`
if [ $ref == '-noenter' ]; then echo "arg $i is $ref"; break; fi
done
Ahora lo mismo, solo la posición del argumento -noenter
se almacena en $mitsos
y la posición del argumento anterior a ese en $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
y ahora $mitsos
tiene la posición de -noenter
o ningún valor y $mary
el valor del argumento anterior -noenter
. En este punto, si $mary
tiene el valor /dir
quesaberel siguiente argumento es -noenter
y puede continuar con la implementación de find
; de lo contrario, utilizará la versión del sistema o imprimirá un mensaje de error. Finalmente, si no le interesa la posición de -noenter
puede omitir la línea mitsos=$i
.