Cómo mover un archivo sin preservar permisos

42

El problema es que quiero poder ver errores al mover un archivo, pero no puedo ver errores con problemas de permisos. En otras palabras, me importa si el archivo no se transmite completamente, pero no quiero ver errores como este:

mv: no se pudo conservar la propiedad de `/home/blah/backup/pgsql.tar.gz ': operación no permitida

Así que quiero algo como: mv $backupfile $destination --ignore-permissions.

El archivo de copia de seguridad puede ser de 1 MiB a 5 GiB y se transfiere a través de NFS.

Nux
fuente
Ocurre también en un dispositivo NTFS conectado, pero este no es el único caso. Ocurre en todos los casos en los que no tiene derechos para cambiar los permisos o no es posible (como en NTFS).
Nux
Esto es útil cuando intenta mover archivos que de alguna manera no se mueven debido a errores de permisos (por ejemplo, porque están montados cifs).
Sridhar Sarnobat

Respuestas:

56

mves la herramienta incorrecta para este trabajo; quieres cpy luego rm. Dado que está moviendo el archivo a otro sistema de archivos, esto es exactamente lo que mvestá haciendo detrás de escena de todos modos, excepto que mvtambién está tratando de preservar los bits de permiso de archivo y la información del propietario / grupo. Esto se debe a mvque preservaría esa información si moviera un archivo dentro del mismo sistema de archivos e mvintente comportarse de la misma manera en ambas situaciones. Dado que no le importa la preservación de los bits de permiso de archivo y la información del propietario / grupo, no use esa herramienta. Uso cp --no-preserve=modey en su rmlugar.

Kyle Jones
fuente
55
Gracias funciona. Terminé haciendo: cp --no-preserve=mode,ownership $backupfile $destinationverifica el código de salida y luego hazlo rm $backupfilesi todo está bien.
Nux
22

Cuando mueve un archivo dentro del mismo sistema de archivos, mvsepara el archivo de su ubicación anterior y lo adjunta a su nueva ubicación; metadatos como los permisos siguen siendo los mismos. Cuando mueve un archivo a un sistema de archivos diferente, mvcopia el archivo, intenta replicar tantos metadatos como sea posible y elimina el original.

Como se está moviendo a un sistema de archivos diferente y no desea replicar muchos metadatos, también podría copiar el archivo y luego eliminar el original.

cp "$backupfile" "$destination" && rm "$backupfile"

Esto conserva los permisos del archivo hasta cierto punto (por ejemplo, legibilidad mundial, ejecubilidad). El tiempo de modificación del archivo no se conserva. Con GNUcp , puede usar la --preserve=…opción para controlar qué metadatos se replican más finamente, por ejemplo --preserve=mode,timestamps.

También puede usar rsyncy decirle lo que desea conservar. La opción -asignifica "preservar la mayoría de los metadatos", que incluye al propietario si se ejecuta solo como root.

rsync -a --no-owner --no-group --remove-source-files "$backupfile" "$destination"
Gilles 'SO- deja de ser malvado'
fuente
La rsyncsolución funciona de manera excelente. Había estado luchando tratando de transferir mi antigua instalación de ubuntu fuera del recurso compartido CIFS. Mi rsync no informó un error al mover el archivo, pero no lo movió y solo informó problemas de permisos.
Sridhar Sarnobat
+1 para la rsyncsolución!
MikeSchinkel