Manuál GNU Coreutils pro mv
říká:
Pokud cílový soubor existuje, ale je normálně nezapisovatelný, standardní
vstup je terminál a volba -f nebo –force není dána, mv
se uživatele zeptá, zda má soubor nahradit. (Můžete vlastnit soubor
nebo mít oprávnění k zápisu do jeho adresáře.) Pokud odpověď
není kladná, soubor je přeskočen.
Verze mv
Používám (GNU coreutils 8.21 na Ubuntu 14.04.3 LTS) vykazuje neočekávané chování:
$ 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
Na základě výše citovaného úryvku manuálu bych očekával mv 1 2
příkaz k zobrazení výzvy uživateli před přepsáním souboru 2
.
Je v mé verzi mv
chyba , nebo chyba v mém chápání? Pokud to druhé, tak co dělá manuál znamená?
Přijatá odpověď:
Ukázalo se, že server používal souborový systém typu „cifs“ (pravděpodobně Common Internet File System, neboli CIFS). To bylo zjištěno spuštěním příkazu df -T
.
CIFS zjevně vykazuje nekonvenční chování s ohledem na oprávnění.
Spuštění stejných příkazů na počítači se souborovým systémem ext4 a poslední verzí Coreutils přineslo:
$ mv 1 2
mv: replace ‘2’, overriding mode 0444 (r--r--r--)?
podle očekávání.