Move preserva a propriedade dos arquivos de origem que não permitem gravações

4

Por favor, considere:

$ id # Me
uid=100(user1) gid=200(group1) groups=200(group1)

$ ls -l tnsnames.ora # So user1 has only read permission on below file.
-rw-rw-r-- 1 oracle dba 411024 Jul 28  2010 tnsnames.ora

$ cp tnsnames.ora tnsnames.ora_bak

$ cat tnsnames.ora_bak > tnsnames.ora # No write access
-bash: tnsnames.ora: Permission denied

$ cp -p tnsnames.ora tnsnames.ora_copy # Copy file and preserve mode, ownership, timestamps. Requires sudo to succeed completely.

$ ls -l tnsnames.ora_copy # Mode and timestamps preserved; ownership not preserved.
-rw-rw-r-- 1 user1 group1 411024 Jul 28  2010 tnsnames.ora_copy

$ mv tnsnames.ora tnsnames.ora_move

$ ls -l tnsnames.ora_move # Move preserves mode, ownership, timestamps.
-rw-rw-r-- 1 oracle dba 411024 Jul 28  2010 tnsnames.ora_move

$

Atualizar

$ ls -l # As pointed out by @Gilles, the source (which is also the destination here) directory has r-x mode which allows mv to work.
drwxrwxrwx  3 oracle dba  4096 Aug 11 20:38 oracle
  1. Como o comando mv pode mover o arquivo e preservar modo, propriedade, carimbos de data / hora, enquanto não podemos fazer o mesmo com cp ...?
  2. Além disso, se você não tiver acesso de gravação a um arquivo, como é possível alterar o local (metadados) do arquivo usando mv ; ou podemos olhar para o outro lado ... onde mv primeiro fará uma cópia do arquivo, então como ele obtém os direitos para definir o proprietário / grupo no arquivo copiado e excluir o arquivo de origem que ele não possui? tem permissões de gravação em ..

Informações sobre a versão do OS / Bash / Utility:

$ echo $SHELL
/bin/bash
$ bash --version
GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)
...
$ uname -a
Linux server1 2.6.18-371.8.1.el5 #1 SMP Fri Mar 28 05:53:58 EDT 2014 x86_64 x86_64 x86_64 GNU/Linux
$ cp --version
cp (GNU coreutils) 5.97
...
$ mv --version
mv (GNU coreutils) 5.97
...
    
por Kent Pawar 12.08.2014 / 02:57

1 resposta

10

mv não faz uma cópia do arquivo e remove o original, a menos que você esteja movendo o arquivo entre sistemas de arquivos diferentes. mv move o arquivo.

Para mover um arquivo, você precisa ter permissão para desanexá-lo do diretório onde ele estava antes e anexá-lo ao diretório em que você o colocou. Em outras palavras, você precisa de permissão de gravação (e execução) no diretório de origem e no diretório de destino. Você não precisa ter nenhuma permissão específica no arquivo, já que não está modificando ou acessando o arquivo em si. (Analogia: você pode mover uma caixa trancada, mesmo que você não tenha a chave, abra a caixa.)

cp -p pode e preserva as permissões do arquivo, mas não pode preservar a propriedade do arquivo em geral. Como você não está executando cp como root, ele não pode criar arquivos que não pertençam a você ou que não pertençam a um grupo ao qual você pertence.

    
por 12.08.2014 / 03:07