Existe alguma diferença entre mv e {cp + rm the old file} no Unix?


13
  • mv a b

  • cp a b;rm a

Esses são dois conjuntos de instruções. Existe alguma diferença entre o que eles fazem?


1
atomicidade? Realmente não sei se o comando mv é atômico.
Adriano Varoli Piazza

Sim. Por que você pergunta?

1
Agora, mvé semelhante ao ln+ rm, no entanto, o primeiro funcionará para movimentos do sistema de arquivos cruzados (que depois se torna cp+ rm), enquanto o último falhará no ln(que não suporta links físicos do sistema de arquivos cruzados).
Chris Jester-Young

Cada dia é um dia de escola - para qualquer um vindo para esta querendo saber como substituir esse comportamento padrão é necessário o --remove-destinationswitch - stackoverflow.com/a/9371263/409638
robert

Respostas:


20

Supondo que os arquivos envolvidos estejam no mesmo sistema de arquivos, o mv simplesmente muda os ponteiros no sistema de arquivos, enquanto o cp copia todo o conteúdo do arquivo e o rm muda os ponteiros novamente. Então mv é muito mais eficiente.


mas eles fazem exatamente a mesma coisa, certo?
Lazer

8
Não, eles não.

2
@eSKay: Não. Dois cenários: 1. O destino não existe. mvapenas renomeia o arquivo (mesmo inode que o arquivo original). cpcria um novo inode para o novo arquivo. 2. O alvo existe. mvDesvincula (remove) o arquivo de destino e renomeia, em uma única etapa. cpsubstitui o inode do arquivo de destino.
Chris Jester-Young

7
Também mvnunca altera a permissão ou propriedade. Imagine que você deseja mover um arquivo do homedir do seu amigo para o seu próprio homedir. Se você mv, você vai acabar com um arquivo em sua casa que pertence ao seu amigo. Você não pode chownou, chmoddependendo das permissões, nem sequer o modifica ou lê. Se você cpseguir rmo arquivo pertencerá a você e está tudo bem.
Ludwig Weinzierl

9

Sim, o mv pode ser atômico no mesmo disco, enquanto a combinação de cp e rm nunca.

Isso pressupõe que o mv seja implementado usando rename(), que é a chamada que tem a garantia. Veja, por exemplo, esta postagem do grupo de notícias , que cita POSIX:

Essa função rename () é equivalente para arquivos regulares àquela definida pelo padrão ISO C. Sua inclusão aqui expande essa definição para incluir ações em diretórios e especifica o comportamento quando o novo parâmetro nomeia um arquivo que já existe. Essa especificação requer que a ação da função seja atômica.


7

No mesmo sistema de arquivos, o mv altera a referência do diretório, apontando para o mesmo inode (dados e metadados do arquivo), assim:

  • é uma operação atômica (não pode ser interrompida por outra operação de arquivo de processo)
  • ocupa apenas uma quantidade trivial de espaço em disco adicional (o nome adicional no diretório)
  • preserva permissões e propriedade de arquivos
  • pode ser muito mais rápido, dependendo da quantidade de dados

Copie e remova

  • não é atômico (outro processo pode interferir entre os comandos cp e rm)
  • requer o armazenamento dos dados do arquivo duas vezes no disco por um curto período (entre os comandos cp e rm)
  • altera permissões e propriedade de arquivo para padrões
  • pode ser muito mais lento ou até falhar, dependendo da quantidade de dados

4

Quando a origem e o destino estão no mesmo volume físico, a primeira abordagem é simplesmente uma renomeação e é muito rápida (mesmo que os arquivos sejam muito grandes).

cp& rmsempre terá que carregar / armazenar todos os dados, mesmo que não sejam necessários.


3

mv é essencialmente uma operação de "renomear". Isso significa que o próprio arquivo é deixado no mesmo local no disco. Nenhuma operação de arquivo real é executada.


2

Sim.

O mv simplesmente altera os metadados do sistema de arquivos no arquivo, relacionados ao seu nome e localização, enquanto o cp cria uma cópia separada do arquivo, que leva muito mais tempo, pois deve ler completamente o primeiro arquivo e gravar seu conteúdo em outro arquivo.


2

cp e rm é muito mais pesado no uso do disco e pode falhar por motivos de espaço em disco.


2

A diferença é que o mv conserva os atributos do arquivo, enquanto o cp, por padrão, não, por exemplo, configurando a data de criação para a data atual.

Para substituir esse padrão, use "cp -p" para preservar a última modificação de dados, a hora do último acesso, o ID do usuário e o ID do grupo (somente se tiver permissões para isso), os bits de permissão de arquivo e o SUID e SGID bits.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.