Al ejecutar este comando:
$ sudo rsync -r --delete --force --checksum --exclude=uploads /data/prep/* /data/app/
Estoy obteniendo el siguiente resultado:
cannot delete non-empty directory: html/js/ckeditor/_source/plugins/uicolor/yui
cannot delete non-empty directory: html/js/ckeditor/_source/plugins/uicolor/yui
cannot delete non-empty directory: html/js/ckeditor/_source/plugins/uicolor
cannot delete non-empty directory: html/js/ckeditor/_source/plugins/uicolor
cannot delete non-empty directory: html/js/ckeditor/_source/plugins
cannot delete non-empty directory: html/js/ckeditor/_source/plugins
cannot delete non-empty directory: html/js/ckeditor/_source
cannot delete non-empty directory: html/js/ckeditor/_samples
cannot delete non-empty directory: html/js/ckeditor/plugins/uicolor/yui
cannot delete non-empty directory: html/js/ckeditor/plugins/uicolor/yui
cannot delete non-empty directory: html/js/ckeditor/plugins/uicolor
Al leerlo man rsync
, tuve la impresión de que la --force
opción le diría a rsync que elimine estos directorios no vacíos, que es el resultado deseado.
Árbitro:
--force force deletion of dirs even if not empty
¿Cómo puedo modificar el comando para eliminar los directorios no vacíos?
Estoy usando rsync versión 3.0.8, en Gentoo Base System versión 2.0.3, en caso de que sea relevante.
Actualización: se agregó sudo
al comando para dejar en claro que este no es un problema de permisos de archivos.
ext3
. Es posible que el sistema de archivos pueda necesitarse o repararse. Lo haréfsck
en la próxima oportunidad y actualizaré con los resultados.fsck
de arreglar el sistema y este problema aún está presente.Respuestas:
¿Intentaste agregar
--delete-excluded
?Si elimina un directorio en sus carpetas excluidas en el lado "remoto",
rsync --delete
no eliminará la carpeta excluida en su sitio "local".fuente
uploads
en loshtml/js/ckeditor/_source/plugins/uicolor/yui
,html/js/ckeditor/_samples
yhtml/js/ckeditor/plugins/uicolor/yui
directorios. Gracias por tu ayuda.--delete-excluded
pero aún desea excluir ciertos archivos / directorios de la eliminación, puede poner estos archivos / directorio en--filter 'protect some_dir/'
, por ejemplo:rsync -ac --delete --delete-excluded --exclude '*.html' --filter 'protect .git/' . /target/destination/
Aquí hay posibles fuentes de este problema:
(1) Este error puede ser el resultado de la opción -b (--backup). Esta opción creará una copia de seguridad de cada archivo eliminado, agregando una tilde ( ~ ) en su nombre de archivo. (Esto me confundió, ya que el nombre del archivo es claramente una copia de seguridad, pero el nombre del directorio no lo es, ya que no puede ver la tilde).
Para verificar si este es el mismo caso, lea su directorio de destino en el nivel más profundo y verifique si hay algún archivo final de tilde (~). Tenga en cuenta que estos nombres de archivos adjuntos tilde son invisibles en algún sistema de exploración de archivos común, por lo que es posible que no los vea.
Para resolver este caso, prefiera la opción --backup-dir = DIR, por ejemplo --backup-dir = .rsync_bak.
(2) La opción --exclude puede tener los mismos resultados. Lo que posiblemente está sucediendo en su caso. El sistema de patrones es poderoso, pero puede ser engañoso. Por ejemplo, si escribe --exclude = '* ~', esto omitirá todos los archivos finales de tilde, resultando exactamente como en el caso (1) anterior.
de la página del manual de rsync:
Si si escribe --exclude = uploads, esto excluirá todos los archivos llamados "updloads", en cualquier nivel de su árbol de archivos.
Verifique si hay un archivo llamado "uploads" dentro de sus directorios incapaces de eliminar.
La solución sería cambiar "--exclude = uploads" a "--exclude = uploads /"
fuente
En mi configuración ((la fuente es el formato Ubuntu tipo ext4 para apuntar al tipo Western Digital fuseblk) funciona con:
fuente
Use reglas en archivos de filtro en lugar de
--exclude
. Estos le permiten marcar las exclusiones como "persistentes", lo que le permitirá eliminar directorios no vacíos que contienen archivos excluidos.Vea esta respuesta para más detalles.
fuente
Un directorio debe estar vacío para que pueda eliminarlo, el sistema de archivos normalmente lo requiere.
Por lo tanto, normalmente
rsync
orm
recursivamente eliminaría todo el contenido primero y solo luego eliminaría el directorio ahora vacío.Si el usuario actual no es el propietario de todos los archivos, los permisos del sistema de archivos no le permitirán eliminar esos archivos. Como no se eliminarán, el directorio no se vaciará y la eliminación fallará.
Mi primera suposición sería que algunos archivos en esos directorios son propiedad de otro usuario, por ejemplo, los usuarios de apache o de nadie.
fuente
ls -la
para ver por qué el directorio todavía no está vacío.lsattr
mostrará archivos inmutables.lsattr
uno de los directorios enumerados genera lo siguiente:--------------- ./assets
(sin indicador i), y el archivo no está en un montaje nfs. ¿Hay alguna otra razón por la que puedas pensar por qué el comando todavía fallaría con sudo?