
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 mv
comando de linha de comando.
Responder1
Não, o padrão mv
faznã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".
mv
comportamento
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
mv
comando 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, mv
remove a fonte de forma semelhante a rm
.Esseaplica-se:
rm
simplesmente exclui o ponteiro. Se você tiver vários ponteiros para o arquivo (links físicos), a exclusão de um desses ponteirosrm
deixará 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, mv
poderia 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 tar
no Mac OS X tem certeza). Compararesse:
Por padrão, se você solicitar
tar
arquivar 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 tar
de onde os obteve.
Para aproveitar tar
sem 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.