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

15

Utilizo el siguiente comando para borrar un directorio, de archivos y directorios de más de 30 días de antigüedad, y moverlos a un directorio de archivo que puedo eliminar después de algunas semanas si nadie solicita 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 este a responder a una pregunta sobre el ASK ubuntu, otro usuario edita el código para cambiar el final de la línea \;para el +ya que 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 +aparece un mensaje de error:

find: missing argument to '-exec'

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

Arronico
fuente
¿Te refieres a esta respuesta ? Esto podría explicar por qué
Wilf
Gracias @Wilf que he actualizado para mostrar en qué respuesta ocurrió la edición. El enlace que proporcionó tiene otro enlace que lo explica de una manera que mi cerebro puede manejar.
Arronical
¡Gracias @souravc de una manera cíclica brillante, esa pregunta es del usuario que editó mi comando! Finalmente, obtengo +múltiples argumentos para el mismo comando, ¡pero mvno puedo hacer frente a eso!
Arronical
@ Arronical mv can, mira mi respuesta ^^
caos

Respuestas:

19

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

Supongamos que el findcomando devuelve los siguientes archivos:

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

El -execcomando 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 crea agregando múltiples 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. Es por eso que findinfluye missing argument to '-exec'en tu ejemplo; se pierde el cierre {}.

caos
fuente
Siempre me he preguntado por qué find -execrequiere {}que sea el último argumento, cuando se usa con +. ¿Alguien sabe por qué se tomó esa decisión de diseño, en lugar de dejar que funcionen construcciones como la línea de comando del OP?
Peter Cordes
11

El usuario explicó su edición ...

El terminador de '+' exec es más rápido que '\;'  ver /ubuntu/558817/what-is-the-difference-between-using-and-in-exec-command;  y crear un archivo de respaldo del archivo original es una buena idea

... usando este enlace . Creo que, básicamente, en lugar de usar múltiples comandos, envía todos los nombres de archivo a una instancia de comando, para acelerar las cosas. Aquí hay un ejemplo de aquí :

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

ls file1
ls file2
ls file3

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

ls file1 file2 file3

Hay otros formularios disponibles usando ;y +también (desde aquí :)

Por lo tanto, la siguiente sintaxis de ejemplo está permitida para el comando find:

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 es su sintaxis mv [OPTION]... SOURCE DEST, a menos que se use la -topción o similar. Sin embargo, debería funcionar lssin opciones adicionales, etc., ya que pueden entender cuándo se dan varios nombres de archivo. También +puede ser necesario escapar (es decir \+)

Wilf
fuente
Ambas respuestas son geniales, pero tengo que darlo al caos por ser un poco más rápido y explicar los mv -tdos +1.
Arronical