Comment déplacer un fichier sans conserver les autorisations

42

Le problème est que je veux être capable de voir les erreurs lors du déplacement d'un fichier, mais pas de voir les erreurs avec un problème d'autorisations. En d'autres termes - je me soucie de savoir si le fichier n'est pas entièrement transmis, mais je ne veux pas voir d'erreurs comme celle-ci:

mv: échec de la conservation de la propriété pour `/home/blah/backup/pgsql.tar.gz ': opération non autorisée

Donc , je veux quelque chose comme: mv $backupfile $destination --ignore-permissions.

Le fichier de sauvegarde peut être compris entre 1 Mo et 5 Go et est transféré via NFS.

Nux
la source
Cela se produit également sur un périphérique NTFS connecté, mais ce n'est pas le seul cas. Cela se produit dans tous les cas où vous n'avez pas le droit de modifier les autorisations ou ce n'est pas possible (comme sur NTFS).
Nux
Ceci est utile lorsque vous essayez de déplacer des fichiers qui ne sont pas déplacés d'une manière ou d'une autre à cause d'erreurs d'autorisations (p. Ex. Parce qu'ils sont montés sur cifs).
Sridhar Sarnobat

Réponses:

56

mvest le mauvais outil pour ce travail; vous voulez cpet alors rm. Puisque vous déplacez le fichier vers un autre système de fichiers, c'est exactement ce qui mvse passe dans les coulisses, sauf que vous mvessayez également de préserver les bits d'autorisation de fichier et les informations de propriétaire / groupe. En effet mv, ces informations seraient conservées si le fichier était déplacé dans le même système de fichiers et mvessayait de se comporter de la même manière dans les deux situations. Puisque vous ne vous souciez pas de la préservation des bits d'autorisation de fichier et des informations de propriétaire / groupe, n'utilisez pas cet outil. Utilisez cp --no-preserve=modeet à la rmplace.

Kyle Jones
la source
5
Merci, ça marche. En fin de compte cp --no-preserve=mode,ownership $backupfile $destination, vérifiez le code de sortie, puis procédez rm $backupfilesi tout va bien.
Nux
22

Lorsque vous déplacez un fichier dans le même système de fichiers, mvdétachez le fichier de son ancien emplacement et attachez-le à son nouvel emplacement. les métadonnées telles que les autorisations restent les mêmes. Lorsque vous déplacez un fichier vers un autre système de fichiers, le mvcopie, tente de répliquer autant de métadonnées que possible et supprime l'original.

Puisque vous passez à un autre système de fichiers et que vous ne souhaitez pas répliquer beaucoup de métadonnées, vous pouvez également copier le fichier, puis supprimer le fichier original.

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

Cela préserve les autorisations du fichier dans une certaine mesure (par exemple, lisibilité mondiale, exécutabilité). L'heure de modification du fichier n'est pas conservée. Avec GNUcp , vous pouvez utiliser l’ --preserve=…option pour contrôler quelles métadonnées sont répliquées plus finement, par exemple --preserve=mode,timestamps.

Vous pouvez également utiliser rsyncet dire ce que vous voulez préserver. L'option -asignifie «conserver la plupart des métadonnées», ce qui inclut le propriétaire si elle est exécutée en tant que root uniquement.

rsync -a --no-owner --no-group --remove-source-files "$backupfile" "$destination"
Gilles, arrête de faire le mal
la source
La rsyncsolution fonctionne à merveille. J'avais eu du mal à transférer mon ancienne installation Ubuntu hors du partage CIFS. Mon rsync n'a pas signalé d'échec du déplacement du fichier, il ne l'a pas déplacé et signale uniquement des problèmes d'autorisations.
Sridhar Sarnobat
+1 pour la rsyncsolution!
MikeSchinkel