Al usar el find
programa con la -execdir
opción, he visto personas decir que {}
se reemplazará con el directorio y +
con el nombre del archivo, pero el manual no dice qué hacen. ¿Existe alguna documentación oficial que explique esto? También quiero saber si se expanden como rutas relativas o absolutas. Intenté crear un script que tomara los parámetros y {}
as +
y guardara su contenido en archivos separados. Supuse que se pasarían como dos parámetros separados y esto me permitiría ver cómo se expande cada uno, pero los resultados que obtengo hacen que parezca que solo se está pasando un parámetro al script, por lo que todavía no puedo completarlo. probarme qué son y cómo se amplían.
Aquí está el comando que estoy ejecutando:find '/home/jesse/hacking/sh_sandbox' -type f -execdir /home/jesse/hacking/sh_sandbox/save_params.sh {} +
El script save_params.sh es un script de shell ejecutable con el siguiente código:
echo $0 >> /home/jesse/hacking/sh_sandbox/zero_param.txt
echo $1 >> /home/jesse/hacking/sh_sandbox/first_param.txt
echo $2 >> /home/jesse/hacking/sh_sandbox/second_param.txt
echo $3 >> /home/jesse/hacking/sh_sandbox/third_param.txt
El archivo de texto zero_param se completa con el nombre esperado del script que se está ejecutando. El archivo first_param.txt se está llenando ./filename
con diferentes nombres de archivo. Tanto el archivo de texto second_param como el Third_param están llenos de líneas en blanco, cada una con el mismo número de líneas que los demás archivos. Esto es lo que me lleva a creer que no se pasa ningún segundo parámetro save_params.sh
.
Respuesta1
+
es el marcador final, {}
se reemplaza con los nombres de archivos, el directorio actual es la ruta.
entonces
$PWD
=/home/jesse/hacking/sh_sandbox/
$0
=/home/jesse/hacking/sh_sandbox/save_params.sh
$1
=./zero_param.txt
$2
=./first_param.txt
$3
=./second_param.txt
$4
=./third_param.txt
o algo así... releyendo la pregunta parece que el script está escrito para modificar el directorio en el que se busca, por lo que lo que realmente sucede puede ser más complejo.
en la primera ejecución solo se encuentra un archivo
$PWD
=/home/jesse/hacking/sh_sandbox/
$0
=/home/jesse/hacking/sh_sandbox/save_params.sh
$1
=./save_params.sh
entonces los archivos se crearían con contenido que reflejara eso.
Respuesta2
find ... -execdir command {} +
no hace nada de eso.
Funciona exactamente igual, find ... -exec
excepto que find
primero cambia el directorio al directorio en el que se encuentran los archivos coincidentes antes de ejecutar el comando.
Ejecute man find
(o si usa GNU busque, info find
o pinfo find
para obtener documentación más detallada) y busque -execdir
.
Desde la find
página de manual de GNU:
-execdir command ;
-execdir command {} +
Me gusta
-exec
, pero el comando especificado se ejecuta desde el subdirectorio que contiene el archivo coincidente, que normalmente no es el directorio en el que comenzó a buscar. Este es un método mucho más seguro para invocar comandos, ya que evita condiciones de carrera durante la resolución de las rutas a los archivos coincidentes.Al igual que con la
-exec
acción, la+
forma de-execdir
creará una línea de comando para procesar más de un archivo coincidente, pero cualquier invocación de comando solo enumerará los archivos que existen en el mismo subdirectorio.Si utiliza esta opción, debe asegurarse de que su
$PATH
variable de entorno no haga referencia a.
; de lo contrario, un atacante puede ejecutar cualquier comando que desee dejando un archivo con el nombre apropiado en un directorio en el que ejecutará-execdir
.Lo mismo se aplica a tener entradas
$PATH
vacías o que no sean nombres de directorio absolutos. Si find encuentra un error, esto a veces puede provocar una salida inmediata, por lo que es posible que algunos comandos pendientes no se ejecuten en absoluto.El resultado de la acción depende de si se utiliza el
+
o la variante; siempre devuelve verdadero, mientras que devuelve verdadero solo si el comando devuelve 0.;
-execdir command {} +
-execdir command {} ;
Tenga en cuenta que, aunque el extracto de la página de manual no lo menciona, debe ;
escaparse como \;
si se ejecutara desde una línea de comandos o script del shell, para que el shell no lo interprete como el final del find
comando, en lugar de pasar como argumento a find
indica el final del find
comando -exec
. +
No es necesario escapar de él .