O comando CentOS 7.2 mv
tentará usar a chamada rename(3)
.
por exemplo, se eu fizer strace mv X Y
, então vejo na saída
rename("X", "Y") = 0
Assim, podemos ver que mv
chamou com sucesso a renomeação.
Se, em vez disso, eu tentar renomear esse diretório para outro disco:
rename("X", "/home/sweh/X") = -1 EXDEV (Invalid cross-device link)
Podemos ver que mv
tentou usar a chamada rename()
e isso falhou. Neste ponto, ele começa a fazer um trabalho recursivo
rmdir("/home/sweh/X") = -1 ENOENT (No such file or directory)
mkdir("/home/sweh/X", 0700) = 0
lstat("/home/sweh/X", {st_mode=S_IFDIR|0700, st_size=4096, ...}) = 0
openat(AT_FDCWD, "X", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3
getdents(3, /* 2 entries */, 32768) = 48
Aqui podemos ver que ele criou o diretório de destino e, em seguida, começamos a ler o diretório atual para fazer a cópia / remoção lenta.
Portanto, podemos concluir que mv
tentará usar a rápida chamada rename()
e só voltará à versão lenta se isso falhar.