Il manuale GNU Coreutils per mv
dice:
Se un file di destinazione esiste ma normalmente non è scrivibile, l'input standard
è un terminale e l'opzione -f o –force non viene fornita, mv
chiede all'utente se sostituire il file. (Potresti essere il proprietario del file
o disporre dell'autorizzazione di scrittura sulla sua directory.) Se la risposta
non è affermativa, il file viene saltato.
Tuttavia, la versione di mv
Sto usando (GNU coreutils 8.21 su Ubuntu 14.04.3 LTS) mostra un comportamento inaspettato:
$ 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
Sulla base dell'estratto del manuale citato sopra, mi sarei aspettato il mv 1 2
comando per aver richiesto all'utente prima di sovrascrivere il file 2
.
C'è un bug nella mia versione di mv
, o un bug nella mia comprensione? Se quest'ultimo, allora cosa fa il manuale significa?
Risposta accettata:
Si scopre che il server utilizzava un file system di tipo "cifs" (presumibilmente il Common Internet File System, noto anche come CIFS). Questo è stato scoperto eseguendo il comando df -T
.
Apparentemente CIFS mostra un comportamento non convenzionale rispetto alle autorizzazioni.
L'esecuzione degli stessi comandi su una macchina con un file system ext4 e una versione recente di Coreutils ha prodotto:
$ mv 1 2
mv: replace ‘2’, overriding mode 0444 (r--r--r--)?
come previsto.