O que acontece quando se move arquivos vinculados através de sistemas de arquivos usando 'mv'?

1

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

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

Estou no snow-leopard do Mac OSX e estou usando o comando mv da linha de comando.

    
por b20000 06.09.2012 / 13:23

2 respostas

0

Não, o padrão mv não não preserva os links de hardware:

~$ which mv
/bin/mv
~$ uname -a
Darwin mini.local 13.4.0 Darwin Kernel Version 13.4.0: Sun Aug 17 19:50:11 PDT 2014; root:xnu-2422.115.4~1/RELEASE_X86_64 x86_64

~$ cd /Volumes/Backup\ primary/
Backup primary$ mkdir test
Backup primary$ cd test/
test$ echo foo > a
test$ ln a b
test$ ls -li a b
14271856 -rw-r--r--  2 user     staff  4 Oct 15 19:23 a
14271856 -rw-r--r--  2 user     staff  4 Oct 15 19:23 b
test$ cd ..
Backup primary$ mv test ../Backup\ secondary/
Backup primary$ ls -li ../Backup\ secondary/test/
total 32
11040478 -rw-r--r--  1 user     staff  4 Oct 15 19:23 a
11040479 -rw-r--r--  1 user     staff  4 Oct 15 19:23 b
    
por 15.10.2014 / 19:30
0

Nota

folders on one file system which have been hard linked together

Geralmente, em Unix, diretórios com hardlinking não são compatíveis . Eu suponho que você quer dizer "arquivos em um diretório são hardlinks para arquivos em outro diretório".

mv behavior

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

Compare este Unix & Resposta do Linux SE . A parte relevante:

A move between filesystems (it doesn't matter if it's on the same physical medium or not) is handled as a file copy followed by a delete. This is in fact exactly what the mv command does. Obviously that means that the destination filesystem has to make a new copy of the file.

Depois que uma cópia é feita, mv remove a fonte da mesma forma que rm . Isso se aplica:

rm simply deletes the pointer. If you have multiple pointers to the file (hard links), then deleting one of those pointers with rm leaves the others completely untouched and the data still available.

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

Se você mover todos os arquivos com hardlink, todos eles desaparecerão do sistema de arquivos de origem e aparecerão no arquivo de destino. Esteja ciente de que mesmo um único mv (movendo vários arquivos) criará cada novo arquivo separadamente, eles não serão mais vinculados uns aos outros. 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 em esta outra resposta ).

Movendo hardlinks para obter hardlinks

Existem outras ferramentas que recriam hardlinks, tar é uma delas (embora eu não saiba se tar no Mac OS X é certo). Comparar este :

By default, if you tell tar to archive a file with hard links, and more than one such link is included among the files to be archived, it archives the file only once, and records the second (and any additional names) as hard links. This means that when you extract that archive, the hard links will be restored.

Observe que os hardlinks serão restaurados entre os arquivos restaurados (ou seja, eles imitarão as conexões de hardlink da origem), mas os arquivos restaurados nunca serão re-hardlinkados para arquivos de origem (ou seus hardlinks que ainda existem), mesmo se eles forem extraídos para o mesmo sistema de arquivos tar os obtiveram.

Para aproveitar o tar sem criar um arquivo grande, você precisará de alguns truques com o 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 isso com um comando separado eventualmente.

    
por 28.06.2018 / 13:07