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?

lazer
fonte
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.


fonte
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.

descontrair
fonte
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
mpez0
fonte
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.

Joachim Sauer
fonte
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.

Philippe Leybaert
fonte
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.

covarde anônimo
fonte
2

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

Ofir
fonte
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.

harrymc
fonte