GNU/Linux >> Tutoriales Linux >  >> Linux

encontrar:-exec rm {} \; vs. -delete - ¿por qué se recomienda ampliamente el primero?

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

Linux
  1. find -exec una función de shell en Linux?

  2. ¿Por qué se requiere el segmento .bss?

  3. Linux, ¿por qué no puedo canalizar el resultado de búsqueda a rm?

  4. adb:Encuentra PID desde el shell de adb

  5. Cómo canalizar los resultados de 'buscar' a mv en Linux

Una alternativa amigable a la herramienta de búsqueda en Linux

¿Por qué el servidor bloqueó mi IP?

¿Por qué Find no acepta '-exec Cp {} Dir +'?

Buscar -exec + Vs Buscar | Xargs:¿Cuál elegir?

¿Salir de Find si falla un -exec?

El comando find Directory de Linux:Explicación