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 -exec
comando está ls -lh
pero 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.
fuente
+
múltiples argumentos para el mismo comando, ¡peromv
no puedo hacer frente a eso!Respuestas:
El usuario en esa publicación puede decir que el
+
signo al final de un-exec
comando es más rápido, pero no por qué.Supongamos que el
find
comando devuelve los siguientes archivos:El
-exec
comando normal (-exec command {} \;
) se ejecuta una vez para cada archivo coincidente. Por ejemplo:Ejecuta:
Si usa el
+
signo (-exec command {} +
), el comando se crea agregando múltiples archivos coincidentes al final del comando. Por ejemplo:Ejecuta:
Para usar la
+
bandera correctamente, el argumento a procesar debe estar al final del comando, no en el medio. Es por eso quefind
influyemissing argument to '-exec'
en tu ejemplo; se pierde el cierre{}
.fuente
find -exec
requiere{}
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?El usuario explicó su edición ...
... 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í :
Hay otros formularios disponibles usando
;
y+
también (desde aquí :)Por lo tanto, la siguiente sintaxis de ejemplo está permitida para el comando find:
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-t
opción o similar. Sin embargo, debería funcionarls
sin opciones adicionales, etc., ya que pueden entender cuándo se dan varios nombres de archivo. También+
puede ser necesario escapar (es decir\+
)fuente
mv -t
dos +1.