Le manuel GNU Coreutils pour mv
dit :
Si un fichier de destination existe mais n'est normalement pas accessible en écriture, l'entrée standard
est un terminal et l'option -f ou –force n'est pas donnée, mv
invite l'utilisateur à remplacer le fichier. (Vous êtes peut-être propriétaire du fichier
ou disposez d'une autorisation d'écriture sur son répertoire.) Si la réponse n'est
pas affirmative, le fichier est ignoré.
Cependant, la version de mv
J'utilise (GNU coreutils 8.21 sur Ubuntu 14.04.3 LTS) présente un comportement inattendu :
$ which mv
/bin/mv
$ ls -l
total 0
$ echo foo > 1; chmod -w 1; cp 1 2; ls -l | cut -d' ' -f 1-5,9
-r-x------ 1 me me 4 1
-r-x------ 1 me me 4 2
$ echo bar > 2
-bash: 2: Permission denied
$ mv 1 2
$ ls -l | cut -d' ' -f 1-5,9
-r-x------ 1 me me 4 2
Sur la base de l'extrait de manuel cité ci-dessus, j'aurais attendu le mv 1 2
commande pour avoir averti l'utilisateur avant d'écraser le fichier 2
.
Y a-t-il un bogue dans ma version de mv
, ou un bug dans ma compréhension ? Si ce dernier, alors qu'est-ce que fait le manuel signifie ?
Réponse acceptée :
Il s'avère que le serveur utilisait un système de fichiers de type "cifs" (probablement le Common Internet File System, alias CIFS). Cela a été découvert en exécutant la commande df -T
.
CIFS présente apparemment un comportement non conventionnel en ce qui concerne les autorisations.
L'exécution des mêmes commandes sur une machine avec un système de fichiers ext4 et une version récente de Coreutils a donné :
$ mv 1 2
mv: replace ‘2’, overriding mode 0444 (r--r--r--)?
comme prévu.