web-dev-qa-db-fra.com

Comment déplacer un fichier sans conserver les autorisations

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

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

Je veux donc quelque chose comme: mv $backupfile $destination --ignore-permissions.

Le fichier de sauvegarde peut être de 1 Mio à 5 GiB et est transféré via NFS.

45
Nux

mv n'est pas le bon outil pour ce travail; vous voulez cp puis rm. Puisque vous déplacez le fichier vers un autre système de fichiers, c'est exactement ce que mv fait dans les coulisses de toute façon, sauf que mv essaie également de conserver les bits d'autorisation de fichier et les informations de propriétaire/groupe. Cela est dû au fait que mv conserverait ces informations s'il déplaçait un fichier dans le même système de fichiers et que mv essayait de se comporter de la même manière dans les deux situations. Étant donné que vous ne vous souciez pas de la conservation des bits d'autorisation de fichier et des informations sur le propriétaire/groupe, n'utilisez pas cet outil. Utilisation cp --no-preserve=mode et rm à la place.

63
Kyle Jones

Lorsque vous déplacez un fichier dans le même système de fichiers, mv détache le fichier de son ancien emplacement et l'attache à 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, mv copie le fichier, tente de répliquer autant de métadonnées que possible et supprime l'original.

Étant donné que vous passez à un autre système de fichiers et que vous ne souhaitez pas répliquer beaucoup de métadonnées, vous pouvez aussi bien copier le fichier, puis supprimer l'original.

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

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

Vous pouvez également utiliser rsync et lui indiquer ce que vous souhaitez conserver. L'option -a signifie "conserver la plupart des métadonnées", ce qui inclut le propriétaire s'il est exécuté en tant que root uniquement.

rsync -a --no-owner --no-group --remove-source-files "$backupfile" "$destination"