¿Cuál es el argumento que falta para -exec?

¿Cuál es el argumento que falta para -exec?

Utilizo el siguiente comando para borrar un directorio de archivos y directorios de más de 30 días y moverlos a un directorio de archivo que puedo eliminar después de unas semanas si nadie me pide que me devuelvan sus archivos. El directorio de destino tiene subdirectorios por nombre de usuario, al igual que el directorio de archivo.

Este es el comando que uso:

find /path/to/directory/username/ -mtime +30 -exec mv "{}" /path/to/archive/username/ \;

Sugerí una versión modificada de esto para responder una pregunta en Ask Ubuntu, otro usuario editó el código para cambiar el final de la línea \;porque +es más rápido (¿y más correcto?).Mira aquí

Sin embargo, usar +de esta manera funciona si el -execcomando está ls -lhpero no en el comando real que uso. Si lo intento +me sale un mensaje de error:

find: missing argument to '-exec'

No entiendo por qué se comporta de esta manera ni cuál sería el comando correcto. Por favor, no publique simplemente una corrección de comando; me gustaría entenderlo en lugar de seguir una sugerencia a ciegas.

Respuesta1

El usuario de esa publicación puede decir que el +signo al final de un -execcomando es más rápido, pero no sabe por qué.

Supongamos que el findcomando devuelve los siguientes archivos:

/path/to/file1
/path/to/file2
/path/to/file3

-execEl comando normal ( -exec command {} \;) se ejecuta una vez para cada archivo coincidente. Por ejemplo:

find ... -exec mv {} /target/ \;

Ejecuta:

mv /path/to/file1 /target/
mv /path/to/file2 /target/
mv /path/to/file3 /target/

Si usa el +signo ( -exec command {} +), el comando se compila agregando varios archivos coincidentes al final del comando. Por ejemplo:

find ... -exec mv -t /target/ {} +

Ejecuta:

mv -t /target/ /path/to/file1 /path/to/file2 /path/to/file3

Para usar la +bandera correctamente, el argumento a procesar debe estar al final del comando, no en el medio. Por eso findecha missing argument to '-exec'en falta tu ejemplo; se pierde el cierre {}.

Respuesta2

El usuario explicó su edición....

El terminador del ejecutivo '+' es más rápido que '\;' consulte https://askubuntu.com/questions/558817/what-is-the-difference-between-using-and-in-exec-command; y crear un archivo de respaldo a partir del archivo original es una buena idea

...usandoeste enlace. Básicamente, creo que en lugar de usar múltiples comandos, envía todos los nombres de archivos a una instancia de comando, para acelerar las cosas. Aquí hay un ejemplo deaquí:

Al usar -exec con punto y coma ( find . -exec ls '{}' \;), se ejecutará

ls file1
ls file2
ls file3

Pero si usa un signo más ( find . -exec ls '{}' \+), todos los nombres de archivos se pasarán como argumentos a un solo comando:

ls file1 file2 file3

Hay otras formas disponibles usando ;y +también (deaquí:)

Por lo tanto, se permite la siguiente sintaxis de ejemplo para el comando de búsqueda:

find . -exec echo {} \;
find . -exec echo {} ';'
find . -exec echo {} ";"
find . -exec echo {} \+
find . -exec echo {} +

SIN EMBARGO, no estoy seguro de que esto funcione con el comando mover de todos modos, ya que su sintaxis es , a menos que se use mv [OPTION]... SOURCE DESTla opción o similar. -tSin embargo, debería funcionar lssin opciones adicionales, etc., ya que pueden entender cuando se proporcionan varios nombres de archivo. Es +posible que también sea necesario escapar (es decir \+, )

información relacionada