tl;dr:-delete
POSIX no lo requiere, -exec
es.
Hechos
Página man de POSIX 1003.1 para find
especifica -exec
pero no -delete
.
Esto significa -exec
debería funcionar prácticamente en todas partes. Me sorprendería encontrar find
que tiene -delete
sin -exec
. Lo contrario es bastante posible. Sistemas especialmente ligeros que usan busybox
tienden a proporcionar solo opciones básicas de línea de comandos.
P.ej. Tengo un OpenWRT en uno de mis enrutadores y es find
entiende -exec
, no entiende -delete
.
No tener -delete
no es gran cosa cuando tienes -exec rm …
. Por otro lado -delete
no puede reemplazar -exec
en general. Es un diseño inteligente permitir omitir -delete
primero.
Experiencia personal, observaciones y opiniones
Lo anterior debería ser la razón principal por la que -exec rm {} \;
es tan ampliamente recomendado. El secundario puede ser un efecto bola de nieve. Los usuarios leen artículos y ejemplos, familiarícense con -exec
y publicar sus propios comandos (por ejemplo, aquí en Super User). Es posible que algunos de ellos ni siquiera sepan -delete
existe.
Pocas veces he visto (o dado) comentarios como 'Puedes usar -delete
en cambio'. Y las respuestas fueron como 'Gracias, no sabía eso'. No recuerdo ninguna respuesta 'Lo sé, pero esto no es POSIX'.
Habiendo dicho todo esto, tiendo a mencionar -delete
siempre que -exec rm {} \;
aparece El motivo es -delete
no genera un nuevo proceso, mientras que -exec rm {} \;
invoca un rm
separado para cada archivo coincidente. Si no puede usar -delete
entonces tu próximo pensamiento debería ser -exec rm {} +
que puede eliminar varios archivos con un solo rm
(todavía invocará rm
más de una vez si es necesario).
¿Por qué no es -exec … +
ampliamente recomendado entonces? Puede ser por sus limitaciones. Puedo imaginar a un usuario sin experiencia pensando 'Esto funciona con rm
, déjame usarlo con mv
!' Entonces -exec mv {} foo/ +
no funciona porque {}
debe estar al final, justo antes de +
. El usuario se frustra y vuelve corriendo a mama ventanas.
Recomendando -delete
Por lo general, es seguro aquí en Super User, creo. La mayoría de las preguntas especifican sistemas operativos "grandes", find
los comandos allí son ricos en opciones. E incluso si hay un usuario cuyo find
es limitado, probablemente recibiré comentarios. Él o ella dice que la solución no funciona para ellos y sugiero -exec rm …
en su lugar, explique el problema, etc.
Un artículo independiente que recomienda -delete
no obtendrá tales comentarios. En caso de cualquier problema, el usuario simplemente irá al siguiente enlace devuelto por Google.
La diferencia está en la flexibilidad. Si usa -exec, entonces ejecuta un comando para cada archivo seleccionado. Si usa -exec, entonces tiene flexibilidad para aplicar otras opciones de búsqueda. Con -delete está restringido en el uso de -prune. Además, su ubicación de -delete afecta sus resultados. Consulte el fragmento de documentación a continuación:
-delete
Delete files; true if removal succeeded. If the removal failed,
an error message is issued. If -delete fails, find’s exit status will be
nonzero (when it eventually exits). Use of -delete automatically turns on
the ‘-depth’ option.
Warnings: Don’t forget that the find command line is evaluated as an
expression, so putting -delete first will make find try to delete every-
thing below the starting points you specified. When testing a find
command line that you later intend to use with -delete, you should
explicitly specify -depth in order to avoid later surprises.
Because -delete implies -depth, you cannot usefully use -prune and -delete
together.
-exec command ;
Execute command; true if 0 status is returned. All following arguments
to find are taken to be arguments to the command until an argument
consisting of ‘;’ is encountered. The string ‘{}’ is replaced by the
current file name being processed everywhere it occurs in the arguments
to the command, not just in arguments where it is alone, as in
some versions of find. Both of these constructions might need to be escaped
(with a ‘\’) or quoted to protect them from expansion by the shell.
See the EXAMPLES section for examples of the use of the -exec option.
The specified command is run once for each matched file. The
command is executed in the starting directory. There are unavoidable security
problems surrounding use of the -exec action; you should use the -execdir
option instead.
-exec command {} +
This variant of the -exec action runs the specified command on the
selected files, but the command line is built by appending each selected
file name at the end; the total number of invocations of the command
will be much less than the number of matched files. The command line is
built in much the same way that xargs builds its command lines.
Only one instance of ‘{}’ is allowed within the command. The command is
executed in the starting directory