O que acontece ao mover arquivos vinculados através de sistemas de arquivos usando `mv`?

O que acontece ao mover arquivos vinculados através de sistemas de arquivos usando `mv`?

Eu tenho uma coleção de pastas em um sistema de arquivos que foram vinculadas (o conteúdo é idêntico).

O que acontece quando movo uma das pastas para outro sistema de arquivos em outro disco?

Estou no Mac OSX snow leopard e estou usando o mvcomando de linha de comando.

Responder1

Não, o padrão mvfaznãopreservar links físicos:

~$ qual mv
/bin/mv
~$ unome -a
Darwin mini.local 13.4.0 Darwin Kernel Versão 13.4.0: domingo, 17 de agosto, 19:50:11 PDT de 2014; raiz:xnu-2422.115.4~1/RELEASE_X86_64 x86_64

~$ cd /Volumes/Backup\ primário/
Backup primário$ teste mkdir
Backup primário$ cd test/
teste$ echo foo > a
teste $ ln ab
teste$ ls -li ab
14271856 -rw-r--r-- 2 funcionários do usuário 4 15 de outubro 19:23 a
14271856 -rw-r--r-- 2 funcionários do usuário 4 15 de outubro 19:23 b
teste$cd..
Backup primário$ mv test ../Backup\secundário/
Backup primário$ ls -li ../Backup\secundário/teste/
total 32
11040478 -rw-r--r-- 1 equipe de usuário 4 15 de outubro 19:23 a
11040479 -rw-r--r-- 1 equipe de usuário 4 15 de outubro 19:23 b

Responder2

Observação

pastas em um sistema de arquivos que foram vinculadas entre si

Geralmente em Unixvincular diretórios juntos não é suportado. Presumo que você queira dizer "arquivos em um diretório são links físicos para arquivos em outro diretório".


mvcomportamento

Digamos que você tenha muitos arquivos vinculados entre si, ou seja, muitos caminhos que levam aos mesmos dados armazenados uma vez no sistema de arquivos.

Compararesta resposta Unix e Linux SE. A parte relevante:

Uma movimentação entre sistemas de arquivos (não importa se está no mesmo meio físico ou não) é tratada como uma cópia de arquivo seguida por uma exclusão. Na verdade, é exatamente isso que o mvcomando faz. Obviamente, isso significa que o sistema de arquivos de destino precisa fazer uma nova cópia do arquivo.

Depois que uma cópia é feita, mvremove a fonte de forma semelhante a rm.Esseaplica-se:

rmsimplesmente exclui o ponteiro. Se você tiver vários ponteiros para o arquivo (links físicos), a exclusão de um desses ponteiros rmdeixará os outros completamente intactos e os dados ainda disponíveis.

Portanto, se você mover alguns dos arquivos vinculados para outro sistema de arquivos,outros hardlinks estarão seguros. Os hardlinks não podem cruzar sistemas de arquivos, portanto a nova cópia não pode ser um hardlink para qualquer coisa deixada no sistema de arquivos de origem.

Se você mover todos os arquivos com link físico, todos eles desaparecerão do sistema de arquivos de origem e aparecerão no de destino. Esteja ciente de que mesmo um único mv(mover vários arquivos) criará cada novo arquivo separadamente, elesnão maisestar vinculados entre si. Em teoria, mvpoderia realizar algum trabalho adicional para detectar hardlinks e recriá-los no sistema de arquivos de destino, mas isso não acontece (como mostrado emesta outra resposta).


Movendo hardlinks para obter hardlinks

Existem outras ferramentas que recriam hardlinks, taré uma delas (embora eu não saiba dizer se tarno Mac OS X tem certeza). Compararesse:

Por padrão, se você solicitar tararquivar um arquivo com links físicos e mais de um desses links estiver incluído entre os arquivos a serem arquivados, ele arquivará o arquivo apenas uma vez e registrará o segundo (e quaisquer nomes adicionais) como links físicos. Isso significa que quando você extrair esse arquivo, os links físicos serão restaurados.

Observe que os hardlinks serão restaurados entre os arquivos restaurados (ou seja, eles imitarão as conexões do hardlink da fonte), mas os arquivos restaurados nunca serão re-ligados aos arquivos de origem (ou aos seus hardlinks que ainda possam existir), mesmo que sejam extraído para o mesmo sistema de arquivos tarde onde os obteve.

Para aproveitar tarsem criar um arquivo grande, você precisa de alguns truques de shell. Por exemplo :

tar -c /source/dirA/ /source/file1  | { cd /foo/destination/ && tar -x; }

O comando executa a cópia sem excluir. Se você precisar excluir a fonte, faça-o eventualmente com um comando separado.

informação relacionada