Quiero encontrar todos los archivos que no son de mi propiedad (es decir, que no tienen permiso para modificarlos). Yo he tratado
find . -exec if [[ ! -O {} ]]; then echo {}; fi ;
Pero si pongo el comando completo -exec
entre comillas, así:
find . -exec 'if [[ ! -O {} ]]; then echo {}; fi' \;
Eso tampoco funciona, porque la referencia al archivo actual {}
está entre comillas y, por lo tanto, no se expande al archivo.
El problema es que no sé cómo incrustar el {}
archivo actual en un archivo más complejo -exec
que simplemente, por ejemplo find . -exec grep smf {} \;
(que se usa {}
solo una vez). ¿Cómo utilizar -exec
la opción en los comandos de búsqueda, donde hace referencia al archivo actual más de una vez? (Eso es usar {}
más tiempo).
Respuesta1
Su código no funciona porque la utilidad que solicita find
ejecutar if
no existe (es una palabra clave en la sintaxis del shell).
La -O
prueba es verdadera si el argumento es un archivo propiedad del usuario actual. La misma prueba se puede realizar por find
sí sola con -user "$USER"
(suponiendo que $USER
se expanda al usuario actual):
find . -type f ! -user "$USER"
También puede utilizar test -O
si su utilidad externa test
admite esa prueba no estándar (verifique man test
):
find . -type f ! -exec test -O {} \; -print
Si aún desea o necesita usar la -O
prueba integrada en el bash
shell, entonces tendrá que generar un bash
shell para realizar la prueba:
find . -type f -exec bash -c '[[ ! -O "$1" ]]' bash {} \; -print
Esto inicia un bash -c
script en línea para cada archivo encontrado que ejecuta la prueba en su primer argumento ( $1
). El argumento se pasa en la línea de comando del script find
(la bash
cadena anterior {}
se colocará dentro $0
del script y ese shell la utilizará para mensajes de error). Si la prueba es verdadera (el archivo no es de su propiedad), -print
entra en vigor e imprime la ruta del archivo.
Puedes hacer esto un poco más eficientemente con
find . -type f -exec bash -c '
for pathname do
[[ ! -O "$pathname" ]] && printf "%s\n" "$pathname"
done' bash {} +
Esto es más eficiente ya que pasa lotes de nombres de rutas encontrados al bash -c
script.
... pero usar -user "$USER"
sería la mejor opción.
Ver también: