Al utilizar plantillas para generar archivos, es importante incluir el nombre de la plantilla dentro de la plantilla. Al leer un archivo generado, le ayuda a encontrar la plantilla utilizada para generarlo.
Quiero buscar todas las plantillas en un directorio que no contengan su propio nombre de archivo, imprimir las que encuentre y salir con un código distinto de cero si se encuentra alguna.
Hasta ahora, esto es lo que se me ocurrió.
find . -name "*.xyz" -exec sh -c 'grep -L $(basename {}) {}' \;
Esto encuentra e imprime con éxito los archivos, pero sale con un código de salida 0, se encuentre o no algún archivo. ¿Cómo puedo encontrar los archivos relevantes y salir con un código distinto de cero cuando se encuentre alguno?
Respuesta1
¿Cómo puedo encontrar los archivos relevantes y salir con un código distinto de cero cuando se encuentre alguno?
Canalice el resultado a grep ''
. La herramienta no alterará el flujo de texto, pero generará un estado de salida 0
dependiendo 1
de si alguna línea lo atraviesa o no.
Sé que lo quieres al revés. Si yo fuera usted, me adaptaría al comportamiento de grep
. Mi razonamiento es: desea conocer archivos que cumplan con sus criterios; el comando los encuentra, por lo quetiene éxitopara encontrar si hay al menos un archivo.
Sin embargo, si insistes en el comportamiento opuesto, simplementenegar el estado de salida. Ejemplo:
! find . -name "*.xyz" -exec sh -c 'grep -L "$(basename "$1")" "$1"' sh {} \; | grep ''
Tenga en cuenta que he depurado su sh
invocación dentro find
. Su enfoque original sería contraproducente si {}
se expandiera a ./a;rm -rf ~;.xyz
(es un nombre de archivo válido en muchos sistemas de archivos Linux).
Respuesta2
Tal vez algo así grep .... && <do if found> || <do if not found>
funcione
Respuesta3
for f in *.xyz; do
grep -q $f $f || echo "$f does not contain itself"
done
Le dará la lista de archivos que está buscando, aunque todavía devuelve un cero (porque el eco tiene éxito).